瀏覽代碼

libobs-opengl: Accelerate dmabuf import

Previously we would actually initialize a texture memory that would then
also have to be deleted when we bound the EGLImage to the texture during
dmabuf import.

Instead simply do not create the dummy texture memory. One odd thing is
that we must still query the texture to ensure its initialized or
binding the EGLImage will not work. So we leave the TEXTURE_MAX_LEVEL
check.

This makes screencapture up to 100x faster on discrete intel cards and
likely has some performance benefit for amd/integrated cards. Without
this dmabufs are actually slower than shared memory for these intel
cards.
Kurt Kartaltepe 2 年之前
父節點
當前提交
041fee0484
共有 2 個文件被更改,包括 2 次插入11 次删除
  1. 1 1
      libobs-opengl/gl-egl-common.c
  2. 1 10
      libobs-opengl/gl-texture2d.c

+ 1 - 1
libobs-opengl/gl-egl-common.c

@@ -186,7 +186,7 @@ struct gs_texture *gl_egl_create_texture_from_eglimage(
 
 	struct gs_texture *texture = NULL;
 	texture = gs_texture_create(width, height, color_format, 1, NULL,
-				    GS_DYNAMIC);
+				    GS_GL_DUMMYTEX);
 	const GLuint gltex = *(GLuint *)gs_texture_get_obj(texture);
 
 	gl_bind_texture(GL_TEXTURE_2D, gltex);

+ 1 - 10
libobs-opengl/gl-texture2d.c

@@ -110,16 +110,7 @@ gs_texture_t *device_texture_create(gs_device_t *device, uint32_t width,
 		if (!gl_bind_texture(GL_TEXTURE_2D, tex->base.texture))
 			goto fail;
 
-		uint32_t row_size =
-			tex->width * gs_get_format_bpp(tex->base.format);
-		uint32_t tex_size = tex->height * row_size / 8;
-		bool compressed = gs_is_compressed_format(tex->base.format);
-		bool did_init = gl_init_face(GL_TEXTURE_2D, tex->base.gl_type,
-					     1, tex->base.gl_format,
-					     tex->base.gl_internal_format,
-					     compressed, tex->width,
-					     tex->height, tex_size, NULL);
-		did_init =
+		bool did_init =
 			gl_tex_param_i(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
 
 		bool did_unbind = gl_bind_texture(GL_TEXTURE_2D, 0);