diff --git a/include/egl.h b/include/egl.h index f4c47ff..7f3321f 100644 --- a/include/egl.h +++ b/include/egl.h @@ -39,8 +39,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); #define EGL_OPENGL_ES2_BIT 0x0004 #define EGL_NONE 0x3038 #define EGL_CONTEXT_CLIENT_VERSION 0x3098 -#define EGL_BACK_BUFFER 0x3084 -#define EGL_GL_TEXTURE_2D 0x30B1 #define GL_TEXTURE_2D 0x0DE1 #define GL_RGB 0x1907 @@ -64,32 +62,6 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void); #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 -#define GLX_BUFFER_SIZE 2 -#define GLX_DOUBLEBUFFER 5 -#define GLX_RED_SIZE 8 -#define GLX_GREEN_SIZE 9 -#define GLX_BLUE_SIZE 10 -#define GLX_ALPHA_SIZE 11 -#define GLX_DEPTH_SIZE 12 - -#define GLX_RGBA_BIT 0x00000001 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_FRONT_EXT 0x20DE -#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 -#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 -#define GLX_TEXTURE_TARGET_EXT 0x20D6 -#define GLX_TEXTURE_2D_EXT 0x20DC -#define GLX_TEXTURE_FORMAT_EXT 0x20D5 -#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 -#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 -#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 -#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 -#define GLX_CONTEXT_FLAGS_ARB 0x2094 - typedef struct { void *egl_library; void *gl_library; @@ -107,18 +79,14 @@ typedef struct { EGLSurface (*eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const int32_t *attrib_list); EGLContext (*eglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const int32_t *attrib_list); unsigned int (*eglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); - EGLSurface (*eglCreatePixmapSurface)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const int32_t *attrib_list); EGLImage (*eglCreateImage)(EGLDisplay dpy, EGLContext ctx, unsigned int target, EGLClientBuffer buffer, const intptr_t *attrib_list); unsigned int (*eglDestroyContext)(EGLDisplay dpy, EGLContext ctx); unsigned int (*eglDestroySurface)(EGLDisplay dpy, EGLSurface surface); unsigned int (*eglDestroyImage)(EGLDisplay dpy, EGLImage image); - unsigned int (*eglBindTexImage)(EGLDisplay dpy, EGLSurface surface, int32_t buffer); unsigned int (*eglSwapInterval)(EGLDisplay dpy, int32_t interval); unsigned int (*eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface); __eglMustCastToProperFunctionPointerType (*eglGetProcAddress)(const char *procname); - unsigned int (*eglExportDMABUFImageQueryMESA)(EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, uint64_t *modifiers); - unsigned int (*eglExportDMABUFImageMESA)(EGLDisplay dpy, EGLImageKHR image, int *fds, int32_t *strides, int32_t *offsets); void (*glEGLImageTargetTexture2DOES)(unsigned int target, GLeglImageOES image); unsigned int (*glGetError)(void); @@ -142,7 +110,6 @@ typedef struct { void (*glBindBuffer)(unsigned int target, unsigned int buffer); void (*glGenBuffers)(int n, unsigned int *buffers); void (*glBufferData)(unsigned int target, khronos_ssize_t size, const void *data, unsigned int usage); - int (*glGetUniformLocation)(unsigned int program, const char *name); void (*glGenVertexArrays)(int n, unsigned int *arrays); void (*glBindVertexArray)(unsigned int array); @@ -157,18 +124,12 @@ typedef struct { void (*glGetProgramInfoLog)(unsigned int program, int bufSize, int *length, char *infoLog); void (*glGetShaderiv)(unsigned int shader, unsigned int pname, int *params); void (*glGetShaderInfoLog)(unsigned int shader, int bufSize, int *length, char *infoLog); - void (*glGetShaderSource)(unsigned int shader, int bufSize, int *length, char *source); void (*glDeleteProgram)(unsigned int program); void (*glDeleteShader)(unsigned int shader); void (*glGetProgramiv)(unsigned int program, unsigned int pname, int *params); void (*glVertexAttribPointer)(unsigned int index, int size, unsigned int type, unsigned char normalized, int stride, const void *pointer); void (*glEnableVertexAttribArray)(unsigned int index); void (*glDrawArrays)(unsigned int mode, int first, int count ); - void (*glReadBuffer)( unsigned int mode ); - void (*glReadPixels)(int x, int y, - int width, int height, - unsigned int format, unsigned int type, - void *pixels ); } gsr_egl; bool gsr_egl_load(gsr_egl *self, Display *dpy); diff --git a/src/capture/xcomposite_cuda.c b/src/capture/xcomposite_cuda.c index fd140c6..7280835 100644 --- a/src/capture/xcomposite_cuda.c +++ b/src/capture/xcomposite_cuda.c @@ -3,7 +3,6 @@ #include "../../include/cuda.h" #include "../../include/window_texture.h" #include "../../include/time.h" -#include #include #include #include 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 #include #include -#include #include #include #include #include -//#include #include /* 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); diff --git a/src/egl.c b/src/egl.c index 325a06f..14ee8d9 100644 --- a/src/egl.c +++ b/src/egl.c @@ -90,12 +90,10 @@ static bool gsr_egl_load_egl(gsr_egl *self, void *library) { { (void**)&self->eglCreateWindowSurface, "eglCreateWindowSurface" }, { (void**)&self->eglCreateContext, "eglCreateContext" }, { (void**)&self->eglMakeCurrent, "eglMakeCurrent" }, - { (void**)&self->eglCreatePixmapSurface, "eglCreatePixmapSurface" }, - { (void**)&self->eglCreateImage, "eglCreateImage" }, /* TODO: use eglCreateImageKHR instead? */ + { (void**)&self->eglCreateImage, "eglCreateImage" }, { (void**)&self->eglDestroyContext, "eglDestroyContext" }, { (void**)&self->eglDestroySurface, "eglDestroySurface" }, { (void**)&self->eglDestroyImage, "eglDestroyImage" }, - { (void**)&self->eglBindTexImage, "eglBindTexImage" }, { (void**)&self->eglSwapInterval, "eglSwapInterval" }, { (void**)&self->eglSwapBuffers, "eglSwapBuffers" }, { (void**)&self->eglGetProcAddress, "eglGetProcAddress" }, @@ -112,8 +110,6 @@ static bool gsr_egl_load_egl(gsr_egl *self, void *library) { } static bool gsr_egl_proc_load_egl(gsr_egl *self) { - self->eglExportDMABUFImageQueryMESA = self->eglGetProcAddress("eglExportDMABUFImageQueryMESA"); - self->eglExportDMABUFImageMESA = self->eglGetProcAddress("eglExportDMABUFImageMESA"); self->glEGLImageTargetTexture2DOES = self->eglGetProcAddress("glEGLImageTargetTexture2DOES"); if(!self->glEGLImageTargetTexture2DOES) { @@ -147,7 +143,6 @@ static bool gsr_egl_load_gl(gsr_egl *self, void *library) { { (void**)&self->glBindBuffer, "glBindBuffer" }, { (void**)&self->glGenBuffers, "glGenBuffers" }, { (void**)&self->glBufferData, "glBufferData" }, - { (void**)&self->glGetUniformLocation, "glGetUniformLocation" }, { (void**)&self->glGenVertexArrays, "glGenVertexArrays" }, { (void**)&self->glBindVertexArray, "glBindVertexArray" }, { (void**)&self->glCreateProgram, "glCreateProgram" }, @@ -161,15 +156,12 @@ static bool gsr_egl_load_gl(gsr_egl *self, void *library) { { (void**)&self->glGetProgramInfoLog, "glGetProgramInfoLog" }, { (void**)&self->glGetShaderiv, "glGetShaderiv" }, { (void**)&self->glGetShaderInfoLog, "glGetShaderInfoLog" }, - { (void**)&self->glGetShaderSource, "glGetShaderSource" }, { (void**)&self->glDeleteProgram, "glDeleteProgram" }, { (void**)&self->glDeleteShader, "glDeleteShader" }, { (void**)&self->glGetProgramiv, "glGetProgramiv" }, { (void**)&self->glVertexAttribPointer, "glVertexAttribPointer" }, { (void**)&self->glEnableVertexAttribArray, "glEnableVertexAttribArray" }, { (void**)&self->glDrawArrays, "glDrawArrays" }, - { (void**)&self->glReadBuffer, "glReadBuffer" }, - { (void**)&self->glReadPixels, "glReadPixels" }, { NULL, NULL } };