diff options
Diffstat (limited to 'src/capture/xcomposite_drm.c')
-rw-r--r-- | src/capture/xcomposite_drm.c | 425 |
1 files changed, 50 insertions, 375 deletions
diff --git a/src/capture/xcomposite_drm.c b/src/capture/xcomposite_drm.c index 489fc45..0f8115f 100644 --- a/src/capture/xcomposite_drm.c +++ b/src/capture/xcomposite_drm.c @@ -6,12 +6,10 @@ #include <stdlib.h> #include <stdio.h> #include <X11/Xlib.h> -#include <X11/extensions/Xcomposite.h> #include <libavutil/hwcontext.h> #include <libavutil/hwcontext_vaapi.h> #include <libavutil/frame.h> #include <libavcodec/avcodec.h> -//#include <drm_fourcc.h> #include <assert.h> /* TODO: Proper error checks and cleanups */ @@ -31,18 +29,11 @@ typedef struct { gsr_egl egl; gsr_vaapi vaapi; - int fourcc; - int num_planes; - uint64_t modifiers; - int dmabuf_fd; - int32_t stride; - int32_t offset; - unsigned int target_textures[2]; - unsigned int FramebufferNameY; - unsigned int FramebufferNameUV; // TODO: Remove - unsigned int quadVAO; + unsigned int framebuffer_y; + unsigned int framebuffer_uv; + unsigned int vao; unsigned int shader_y; unsigned int shader_uv; @@ -54,12 +45,7 @@ static int max_int(int a, int b) { return a > b ? a : b; } -static int min_int(int a, int b) { - return a < b ? a : b; -} - static bool drm_create_codec_context(gsr_capture_xcomposite_drm *cap_xcomp, AVCodecContext *video_codec_context) { - // TODO: "/dev/dri/card0" AVBufferRef *device_ctx; if(av_hwdevice_ctx_create(&device_ctx, AV_HWDEVICE_TYPE_VAAPI, "/dev/dri/card0", NULL, 0) < 0) { fprintf(stderr, "Error: Failed to create hardware device context\n"); @@ -77,7 +63,7 @@ static bool drm_create_codec_context(gsr_capture_xcomposite_drm *cap_xcomp, AVCo (AVHWFramesContext *)frame_context->data; hw_frame_context->width = video_codec_context->width; hw_frame_context->height = video_codec_context->height; - hw_frame_context->sw_format = AV_PIX_FMT_NV12;//AV_PIX_FMT_0RGB32;//AV_PIX_FMT_YUV420P;//AV_PIX_FMT_0RGB32;//AV_PIX_FMT_NV12; + hw_frame_context->sw_format = AV_PIX_FMT_NV12; hw_frame_context->format = video_codec_context->pix_fmt; hw_frame_context->device_ref = device_ctx; hw_frame_context->device_ctx = (AVHWDeviceContext*)device_ctx->data; @@ -88,8 +74,7 @@ static bool drm_create_codec_context(gsr_capture_xcomposite_drm *cap_xcomp, AVCo cap_xcomp->va_dpy = vactx->display; if (av_hwframe_ctx_init(frame_context) < 0) { - fprintf(stderr, "Error: Failed to initialize hardware frame context " - "(note: ffmpeg version needs to be > 4.0)\n"); + fprintf(stderr, "Error: Failed to initialize hardware frame context (note: ffmpeg version needs to be > 4.0)\n"); av_buffer_unref(&device_ctx); //av_buffer_unref(&frame_context); return false; @@ -221,131 +206,34 @@ unsigned int esLoadProgram ( gsr_capture_xcomposite_drm *cap_xcomp, const char * return programObject; } +#define RGB_TO_YUV "const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0,\n" \ + " 0.504, -0.368, -0.291, 0.0,\n" \ + " 0.098, -0.071, 0.439, 0.0,\n" \ + " 0.0625, 0.500, 0.500, 1.0);" + static unsigned int LoadShadersY(gsr_capture_xcomposite_drm *cap_xcomp) { char vShaderStr[] = - "#version 300 es \n" - "in vec2 pos; \n" - "in vec2 texcoords; \n" - "out vec2 texcoords_out; \n" - "void main() \n" - "{ \n" - " texcoords_out = texcoords; \n" - " gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); \n" - "} \n"; + "#version 300 es \n" + "in vec2 pos; \n" + "in vec2 texcoords; \n" + "out vec2 texcoords_out; \n" + "void main() \n" + "{ \n" + " texcoords_out = texcoords; \n" + " gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); \n" + "} \n"; -#if 0 - char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex; \n" - "out vec4 FragColor; \n" - - - "float imageWidth = 1920.0;\n" - "float imageHeight = 1080.0;\n" - - "float getYPixel(vec2 position) {\n" - " position.y = (position.y * 2.0 / 3.0) + (1.0 / 3.0);\n" - " return texture2D(tex, position).x;\n" - "}\n" -"\n" - "vec2 mapCommon(vec2 position, float planarOffset) {\n" - " planarOffset += (imageWidth * floor(position.y / 2.0)) / 2.0 +\n" - " floor((imageWidth - 1.0 - position.x) / 2.0);\n" - " float x = floor(imageWidth - 1.0 - floor(mod(planarOffset, imageWidth)));\n" - " float y = floor(floor(planarOffset / imageWidth));\n" - " return vec2((x + 0.5) / imageWidth, (y + 0.5) / (1.5 * imageHeight));\n" - "}\n" -"\n" - "vec2 mapU(vec2 position) {\n" - " float planarOffset = (imageWidth * imageHeight) / 4.0;\n" - " return mapCommon(position, planarOffset);\n" - "}\n" -"\n" - "vec2 mapV(vec2 position) {\n" - " return mapCommon(position, 0.0);\n" - "}\n" - - "void main() \n" - "{ \n" - - "vec2 pixelPosition = vec2(floor(imageWidth * texcoords_out.x),\n" - " floor(imageHeight * texcoords_out.y));\n" - "pixelPosition -= vec2(0.5, 0.5);\n" -"\n" - "float yChannel = getYPixel(texcoords_out);\n" - "float uChannel = texture2D(tex, mapU(pixelPosition)).x;\n" - "float vChannel = texture2D(tex, mapV(pixelPosition)).x;\n" - "vec4 channels = vec4(yChannel, uChannel, vChannel, 1.0);\n" - "mat4 conversion = mat4(1.0, 0.0, 1.402, -0.701,\n" - " 1.0, -0.344, -0.714, 0.529,\n" - " 1.0, 1.772, 0.0, -0.886,\n" - " 0, 0, 0, 0);\n" - "vec3 rgb = (channels * conversion).xyz;\n" - - " FragColor = vec4(rgb, 1.0); \n" - "} \n"; -#elif 1 - char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex1; \n" - //"uniform sampler2D tex2; \n" - "out vec4 FragColor; \n" - //"out vec4 FragColor2; \n" - "mat4 RGBtoYUV() {\n" - " return mat4(\n" - " vec4(0.257, 0.439, -0.148, 0.0),\n" - " vec4(0.504, -0.368, -0.291, 0.0),\n" - " vec4(0.098, -0.071, 0.439, 0.0),\n" - " vec4(0.0625, 0.500, 0.500, 1.0)\n" - " );\n" - "}\n" - "void main() \n" - "{ \n" - //" vec3 yuv = rgb2yuv(texture(tex1, texcoords_out).rgb); \n" - //" FragColor.x = yuv.x; \n" - //" FragColor2.xy = yuv.xy; \n" - //" vec3 rgb = texture(tex1, texcoords_out).rgb;\n" - "FragColor.x = (RGBtoYUV() * vec4(texture(tex1, texcoords_out).rgb, 1.0)).x;\n" - //"FragColor2.xy = (RGBtoYUV() * vec4(texture(tex1, texcoords_out*2.0).rgb, 1.0)).zy;\n" - "} \n"; -#else char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex; \n" - "out vec4 FragColor; \n" - - "vec3 rgb2yuv(vec3 rgb){\n" - " float y = 0.299*rgb.r + 0.587*rgb.g + 0.114*rgb.b;\n" - " return vec3(y, 0.493*(rgb.b-y), 0.877*(rgb.r-y));\n" - "}\n" - - "vec3 yuv2rgb(vec3 yuv){\n" - " float y = yuv.x;\n" - " float u = yuv.y;\n" - " float v = yuv.z;\n" - " \n" - " return vec3(\n" - " y + 1.0/0.877*v,\n" - " y - 0.39393*u - 0.58081*v,\n" - " y + 1.0/0.493*u\n" - " );\n" - "}\n" - - "void main() \n" - "{ \n" - " float s = 0.5;\n" - " vec3 lum = texture(tex, texcoords_out).rgb;\n" - " vec3 chr = texture(tex, floor(texcoords_out*s-.5)/s).rgb;\n" - " vec3 rgb = vec3(rgb2yuv(lum).x, rgb2yuv(chr).yz);\n" - " FragColor = vec4(rgb, 1.0); \n" - "} \n"; -#endif + "#version 300 es \n" + "precision mediump float; \n" + "in vec2 texcoords_out; \n" + "uniform sampler2D tex1; \n" + "out vec4 FragColor; \n" + RGB_TO_YUV + "void main() \n" + "{ \n" + " FragColor.x = (RGBtoYUV * vec4(texture(tex1, texcoords_out).rgb, 1.0)).x; \n" + "} \n"; unsigned int shader_program = esLoadProgram(cap_xcomp, vShaderStr, fShaderStr); if (shader_program == 0) { @@ -370,119 +258,17 @@ static unsigned int LoadShadersUV(gsr_capture_xcomposite_drm *cap_xcomp) { " gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); \n" "} \n"; -#if 0 - char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex; \n" - "out vec4 FragColor; \n" - - - "float imageWidth = 1920.0;\n" - "float imageHeight = 1080.0;\n" - - "float getYPixel(vec2 position) {\n" - " position.y = (position.y * 2.0 / 3.0) + (1.0 / 3.0);\n" - " return texture2D(tex, position).x;\n" - "}\n" -"\n" - "vec2 mapCommon(vec2 position, float planarOffset) {\n" - " planarOffset += (imageWidth * floor(position.y / 2.0)) / 2.0 +\n" - " floor((imageWidth - 1.0 - position.x) / 2.0);\n" - " float x = floor(imageWidth - 1.0 - floor(mod(planarOffset, imageWidth)));\n" - " float y = floor(floor(planarOffset / imageWidth));\n" - " return vec2((x + 0.5) / imageWidth, (y + 0.5) / (1.5 * imageHeight));\n" - "}\n" -"\n" - "vec2 mapU(vec2 position) {\n" - " float planarOffset = (imageWidth * imageHeight) / 4.0;\n" - " return mapCommon(position, planarOffset);\n" - "}\n" -"\n" - "vec2 mapV(vec2 position) {\n" - " return mapCommon(position, 0.0);\n" - "}\n" - - "void main() \n" - "{ \n" - - "vec2 pixelPosition = vec2(floor(imageWidth * texcoords_out.x),\n" - " floor(imageHeight * texcoords_out.y));\n" - "pixelPosition -= vec2(0.5, 0.5);\n" -"\n" - "float yChannel = getYPixel(texcoords_out);\n" - "float uChannel = texture2D(tex, mapU(pixelPosition)).x;\n" - "float vChannel = texture2D(tex, mapV(pixelPosition)).x;\n" - "vec4 channels = vec4(yChannel, uChannel, vChannel, 1.0);\n" - "mat4 conversion = mat4(1.0, 0.0, 1.402, -0.701,\n" - " 1.0, -0.344, -0.714, 0.529,\n" - " 1.0, 1.772, 0.0, -0.886,\n" - " 0, 0, 0, 0);\n" - "vec3 rgb = (channels * conversion).xyz;\n" - - " FragColor = vec4(rgb, 1.0); \n" - "} \n"; -#elif 1 char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex1; \n" - //"uniform sampler2D tex2; \n" - "out vec4 FragColor; \n" - //"out vec4 FragColor2; \n" - "mat4 RGBtoYUV() {\n" - " return mat4(\n" - " vec4(0.257, 0.439, -0.148, 0.0),\n" - " vec4(0.504, -0.368, -0.291, 0.0),\n" - " vec4(0.098, -0.071, 0.439, 0.0),\n" - " vec4(0.0625, 0.500, 0.500, 1.0)\n" - " );\n" - "}\n" - "void main() \n" - "{ \n" - //" vec3 yuv = rgb2yuv(texture(tex1, texcoords_out).rgb); \n" - //" FragColor.x = yuv.x; \n" - //" FragColor2.xy = yuv.xy; \n" - //" vec3 rgb = texture(tex1, texcoords_out).rgb;\n" - //"FragColor.x = (RGBtoYUV() * vec4(texture(tex1, texcoords_out).rgb, 1.0)).x;\n" - "FragColor.xy = (RGBtoYUV() * vec4(texture(tex1, texcoords_out*2.0).rgb, 1.0)).zy;\n" - "} \n"; -#else - char fShaderStr[] = - "#version 300 es \n" - "precision mediump float; \n" - "in vec2 texcoords_out; \n" - "uniform sampler2D tex; \n" - "out vec4 FragColor; \n" - - "vec3 rgb2yuv(vec3 rgb){\n" - " float y = 0.299*rgb.r + 0.587*rgb.g + 0.114*rgb.b;\n" - " return vec3(y, 0.493*(rgb.b-y), 0.877*(rgb.r-y));\n" - "}\n" - - "vec3 yuv2rgb(vec3 yuv){\n" - " float y = yuv.x;\n" - " float u = yuv.y;\n" - " float v = yuv.z;\n" - " \n" - " return vec3(\n" - " y + 1.0/0.877*v,\n" - " y - 0.39393*u - 0.58081*v,\n" - " y + 1.0/0.493*u\n" - " );\n" - "}\n" - - "void main() \n" - "{ \n" - " float s = 0.5;\n" - " vec3 lum = texture(tex, texcoords_out).rgb;\n" - " vec3 chr = texture(tex, floor(texcoords_out*s-.5)/s).rgb;\n" - " vec3 rgb = vec3(rgb2yuv(lum).x, rgb2yuv(chr).yz);\n" - " FragColor = vec4(rgb, 1.0); \n" - "} \n"; -#endif + "#version 300 es \n" + "precision mediump float; \n" + "in vec2 texcoords_out; \n" + "uniform sampler2D tex1; \n" + "out vec4 FragColor; \n" + RGB_TO_YUV + "void main() \n" + "{ \n" + " FragColor.xy = (RGBtoYUV * vec4(texture(tex1, texcoords_out*2.0).rgb, 1.0)).zy; \n" + "} \n"; unsigned int shader_program = esLoadProgram(cap_xcomp, vShaderStr, fShaderStr); if (shader_program == 0) { @@ -531,18 +317,6 @@ static int gsr_capture_xcomposite_drm_start(gsr_capture *cap, AVCodecContext *vi return -1; } - if(!cap_xcomp->egl.eglExportDMABUFImageQueryMESA) { - fprintf(stderr, "gsr error: gsr_capture_xcomposite_drm_start: could not find eglExportDMABUFImageQueryMESA\n"); - gsr_egl_unload(&cap_xcomp->egl); - return -1; - } - - if(!cap_xcomp->egl.eglExportDMABUFImageMESA) { - fprintf(stderr, "gsr error: gsr_capture_xcomposite_drm_start: could not find eglExportDMABUFImageMESA\n"); - gsr_egl_unload(&cap_xcomp->egl); - return -1; - } - if(!gsr_vaapi_load(&cap_xcomp->vaapi)) { fprintf(stderr, "gsr error: gsr_capture_xcomposite_drm_start: failed to load vaapi\n"); gsr_egl_unload(&cap_xcomp->egl); @@ -551,37 +325,7 @@ static int gsr_capture_xcomposite_drm_start(gsr_capture *cap, AVCodecContext *vi /* Disable vsync */ cap_xcomp->egl.eglSwapInterval(cap_xcomp->egl.egl_display, 0); -#if 0 - // TODO: Fallback to composite window - if(window_texture_init(&cap_xcomp->window_texture, cap_xcomp->dpy, cap_xcomp->params.window, &cap_xcomp->gl) != 0) { - fprintf(stderr, "gsr error: gsr_capture_xcomposite_start: failed get window texture for window %ld\n", cap_xcomp->params.window); - gsr_egl_unload(&cap_xcomp->egl); - return -1; - } - cap_xcomp->egl.glBindTexture(GL_TEXTURE_2D, window_texture_get_opengl_texture_id(&cap_xcomp->window_texture)); - cap_xcomp->texture_size.x = 0; - cap_xcomp->texture_size.y = 0; - cap_xcomp->egl.glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &cap_xcomp->texture_size.x); - cap_xcomp->egl.glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &cap_xcomp->texture_size.y); - cap_xcomp->egl.glBindTexture(GL_TEXTURE_2D, 0); - - cap_xcomp->texture_size.x = max_int(2, cap_xcomp->texture_size.x & ~1); - cap_xcomp->texture_size.y = max_int(2, cap_xcomp->texture_size.y & ~1); - - cap_xcomp->target_texture_id = gl_create_texture(cap_xcomp, cap_xcomp->texture_size.x, cap_xcomp->texture_size.y); - if(cap_xcomp->target_texture_id == 0) { - fprintf(stderr, "gsr error: gsr_capture_xcomposite_start: failed to create opengl texture\n"); - gsr_capture_xcomposite_stop(cap, video_codec_context); - return -1; - } - - video_codec_context->width = cap_xcomp->texture_size.x; - video_codec_context->height = cap_xcomp->texture_size.y; - - cap_xcomp->window_resize_timer = clock_get_monotonic_seconds(); - return 0; -#else // TODO: Fallback to composite window if(window_texture_init(&cap_xcomp->window_texture, cap_xcomp->dpy, cap_xcomp->params.window, &cap_xcomp->egl) != 0) { fprintf(stderr, "gsr error: gsr_capture_xcomposite_drm_start: failed get window texture for window %ld\n", cap_xcomp->params.window); @@ -602,47 +346,13 @@ static int gsr_capture_xcomposite_drm_start(gsr_capture *cap, AVCodecContext *vi video_codec_context->width = cap_xcomp->texture_size.x; video_codec_context->height = cap_xcomp->texture_size.y; - { - const intptr_t pixmap_attrs[] = { - EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, - EGL_NONE, - }; - - EGLImage img = cap_xcomp->egl.eglCreateImage(cap_xcomp->egl.egl_display, cap_xcomp->egl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(uint64_t)window_texture_get_opengl_texture_id(&cap_xcomp->window_texture), pixmap_attrs); - if(!img) { - fprintf(stderr, "eglCreateImage failed\n"); - return -1; - } - - if(!cap_xcomp->egl.eglExportDMABUFImageQueryMESA(cap_xcomp->egl.egl_display, img, &cap_xcomp->fourcc, &cap_xcomp->num_planes, &cap_xcomp->modifiers)) { - fprintf(stderr, "eglExportDMABUFImageQueryMESA failed\n"); - return -1; - } - - if(cap_xcomp->num_planes != 1) { - // TODO: FAIL! - fprintf(stderr, "Blablalba\n"); - return -1; - } - - if(!cap_xcomp->egl.eglExportDMABUFImageMESA(cap_xcomp->egl.egl_display, img, &cap_xcomp->dmabuf_fd, &cap_xcomp->stride, &cap_xcomp->offset)) { - fprintf(stderr, "eglExportDMABUFImageMESA failed\n"); - return -1; - } - - fprintf(stderr, "texture: %u, dmabuf: %d, stride: %d, offset: %d\n", window_texture_get_opengl_texture_id(&cap_xcomp->window_texture), cap_xcomp->dmabuf_fd, cap_xcomp->stride, cap_xcomp->offset); - fprintf(stderr, "fourcc: %d, num planes: %d, modifiers: %zu\n", cap_xcomp->fourcc, cap_xcomp->num_planes, cap_xcomp->modifiers); - } - if(!drm_create_codec_context(cap_xcomp, video_codec_context)) { fprintf(stderr, "failed to create hw codec context\n"); gsr_egl_unload(&cap_xcomp->egl); return -1; } - //fprintf(stderr, "sneed: %u\n", cap_xcomp->FramebufferName); return 0; -#endif } static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame **frame) { @@ -670,9 +380,6 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi return; } - fprintf(stderr, "fourcc: %u\n", cap_xcomp->fourcc); - fprintf(stderr, "va surface id: %u\n", (VASurfaceID)(uintptr_t)(*frame)->data[3]); - VADRMPRIMESurfaceDescriptor prime; VASurfaceID surface_id = (uintptr_t)(*frame)->data[3]; @@ -749,11 +456,10 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi - cap_xcomp->egl.glGenFramebuffers(1, &cap_xcomp->FramebufferNameY); - cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->FramebufferNameY); + cap_xcomp->egl.glGenFramebuffers(1, &cap_xcomp->framebuffer_y); + cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->framebuffer_y); cap_xcomp->egl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cap_xcomp->target_textures[0], 0); - // cap_xcomp->egl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, cap_xcomp->target_textures[1], 0); // Set the list of draw buffers. unsigned int DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; @@ -766,11 +472,10 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, 0); - cap_xcomp->egl.glGenFramebuffers(1, &cap_xcomp->FramebufferNameUV); - cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->FramebufferNameUV); + cap_xcomp->egl.glGenFramebuffers(1, &cap_xcomp->framebuffer_uv); + cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->framebuffer_uv); cap_xcomp->egl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cap_xcomp->target_textures[1], 0); - // cap_xcomp->egl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, cap_xcomp->target_textures[1], 0); // Set the list of draw buffers. cap_xcomp->egl.glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers @@ -782,31 +487,9 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, 0); - //cap_xcomp->egl.glGenVertexArrays(1, &cap_xcomp->quad_VertexArrayID); - //cap_xcomp->egl.glBindVertexArray(cap_xcomp->quad_VertexArrayID); - static const float g_quad_vertex_buffer_data[] = { - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - -1.0f, 1.0f, 0.0f, - -1.0f, 1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - 1.0f, 1.0f, 0.0f, - }; - - //cap_xcomp->egl.glGenBuffers(1, &cap_xcomp->quad_vertexbuffer); - //cap_xcomp->egl.glBindBuffer(GL_ARRAY_BUFFER, cap_xcomp->quad_vertexbuffer); - //cap_xcomp->egl.glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); - - // Create and compile our GLSL program from the shaders cap_xcomp->shader_y = LoadShadersY(cap_xcomp); cap_xcomp->shader_uv = LoadShadersUV(cap_xcomp); - //int tex1 = cap_xcomp->egl.glGetUniformLocation(cap_xcomp->shader_y, "tex1"); - //cap_xcomp->egl.glUniform1i(tex1, 0); - //tex1 = cap_xcomp->egl.glGetUniformLocation(cap_xcomp->shader_uv, "tex1"); - //cap_xcomp->egl.glUniform1i(tex1, 0); - //int tex2 = cap_xcomp->egl.glGetUniformLocation(shader_program, "tex2"); - //fprintf(stderr, "uniform id: %u\n", tex1); float vVertices[] = { -1.0f, 1.0f, 0.0f, 1.0f, @@ -819,9 +502,9 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi }; unsigned int quadVBO; - cap_xcomp->egl.glGenVertexArrays(1, &cap_xcomp->quadVAO); + cap_xcomp->egl.glGenVertexArrays(1, &cap_xcomp->vao); cap_xcomp->egl.glGenBuffers(1, &quadVBO); - cap_xcomp->egl.glBindVertexArray(cap_xcomp->quadVAO); + cap_xcomp->egl.glBindVertexArray(cap_xcomp->vao); cap_xcomp->egl.glBindBuffer(GL_ARRAY_BUFFER, quadVBO); cap_xcomp->egl.glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), &vVertices, GL_STATIC_DRAW); @@ -832,17 +515,9 @@ static void gsr_capture_xcomposite_drm_tick(gsr_capture *cap, AVCodecContext *vi cap_xcomp->egl.glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); cap_xcomp->egl.glBindVertexArray(0); - - //cap_xcomp->egl.glUniform1i(tex1, 0); - //cap_xcomp->egl.glUniform1i(tex2, 1); - - //cap_xcomp->egl.glViewport(0, 0, 1920, 1080); - - //cap_xcomp->egl.glBindBuffer(GL_ARRAY_BUFFER, 0); - //cap_xcomp->egl.glBindVertexArray(0); - } else { // This happens on intel + } else { fprintf(stderr, "unexpected fourcc: %u, expected nv12\n", prime.fourcc); - abort(); + return; } // Clear texture with black background because the source texture (window_texture_get_opengl_texture_id(&cap_xcomp->window_texture)) @@ -865,12 +540,12 @@ static int gsr_capture_xcomposite_drm_capture(gsr_capture *cap, AVFrame *frame) gsr_capture_xcomposite_drm *cap_xcomp = cap->priv; vec2i source_size = cap_xcomp->texture_size; - cap_xcomp->egl.glBindVertexArray(cap_xcomp->quadVAO); + cap_xcomp->egl.glBindVertexArray(cap_xcomp->vao); cap_xcomp->egl.glViewport(0, 0, source_size.x, source_size.y); cap_xcomp->egl.glBindTexture(GL_TEXTURE_2D, window_texture_get_opengl_texture_id(&cap_xcomp->window_texture)); { - cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->FramebufferNameY); + cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->framebuffer_y); //cap_xcomp->egl.glClear(GL_COLOR_BUFFER_BIT); cap_xcomp->egl.glUseProgram(cap_xcomp->shader_y); @@ -878,7 +553,7 @@ static int gsr_capture_xcomposite_drm_capture(gsr_capture *cap, AVFrame *frame) } { - cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->FramebufferNameUV); + cap_xcomp->egl.glBindFramebuffer(GL_FRAMEBUFFER, cap_xcomp->framebuffer_uv); //cap_xcomp->egl.glClear(GL_COLOR_BUFFER_BIT); cap_xcomp->egl.glUseProgram(cap_xcomp->shader_uv); |