CN108733356A - 一种纹理共享方法、计算机设备和存储介质 - Google Patents
一种纹理共享方法、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN108733356A CN108733356A CN201810458365.7A CN201810458365A CN108733356A CN 108733356 A CN108733356 A CN 108733356A CN 201810458365 A CN201810458365 A CN 201810458365A CN 108733356 A CN108733356 A CN 108733356A
- Authority
- CN
- China
- Prior art keywords
- texture
- shared
- handle
- shared texture
- opengl
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/04—Texture mapping
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Image Generation (AREA)
Abstract
本发明提供了一种纹理共享方法、计算机设备和存储介质,该方法包括:在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄;将所述第一共享纹理的句柄传递给主控进程;在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。实现了采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享。
Description
技术领域
本发明属于计算机技术领域,尤其涉及一种纹理共享方法、计算机设备和存储介质。
背景技术
在以多进程方式进行解码的播放器框架,一个播放器系统包含有两个进程,一个是用户可见的播放器主控进程,一个是用户不可见的后台解码进程解码进程。其中解码进程负责音视频的解码,主控进程负责视频的绘制。
在Windows操作系统的图形渲染API(Application Programming Interface,应用程序编程接口)中,有OpenGL(Open Graphics Library,开放式图形库)与D3D(Direct3D),其中OpenGL又分为桌面版本与移动嵌入式版本,其中桌面版本在Windows上称之为WGL(Windows OpenGL),而移动嵌入式版本OpenGL ES(OpenGL for Embedded Systems,嵌入式系统OpenGL)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。在一些实际应用中,主控进程采用的是OpenGL来完成视频图像的绘制,而在解码进程中,当采用DXVA(DirectX Video Acceleratiron,DirectX视频加速)与Direct3D9进行硬件解码时,解码完成后生成的视频图像是以IDirect3DSurface9的形式存在的。
然而,大多桌面版本的OpenGL不支持NV_DX_Interop扩展,在用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中,这将是一个非常大的开销,必然会极大的影响程序的运行效率。
发明内容
本申请实施例通过提供一种纹理共享方法、计算机设备和存储介质,可以实现采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,解决了现有技术中,桌面版本的OpenGL不支持NV_DX_Interop扩展,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
第一方面,本申请提供了一种纹理共享方法,其特征在于,所述方法包括:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
可选的,所述在所述主控进程中,通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理之前,所述方法还包括:
判断是否已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理,若是,则执行通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理的步骤。
可选的,所述在解码进程中,将所述第一共享纹理的句柄传递给主控进程,包括:
向所述主控进程发送绘制消息,所述绘制消息包括所述第一共享纹理的句柄。
可选的,所述主控进程与所述解码进程通过RPC进行连接。
第二方面,本申请还提供了一种纹理共享装置,其特征在于,所述装置包括:
第一初始化单元,用于在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;
第二初始化单元,用于在主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;
传递单元,用于通过所述解码进程将所述第一共享纹理的句柄传递给所述主控进程;
拷贝单元,用于通过所述主控进程根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;
获取单元,用于在所述主控进程中,通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
可选的,所述装置还包括:
显存同步单元,用于判断所述主控进程是否已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理,若是,则执行所述获取单元的步骤。
可选的,所述传递单元具体用于:
通过所述解码进程向所述主控进程发送绘制消息,所述绘制消息包括所述第一共享纹理的句柄。
可选的,所述主控进程与所述解码进程通过RPC进行连接。
第三方面,本申请还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
第四方面,本申请还提供了一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
可见,本申请通过在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;在所述主控进程中,创建OpenGLES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。实现了采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
附图说明
图1为本申请实施例中提供的纹理共享方法的流程图;
图2为本申请实施例中提供的纹理共享装置的结构示意图;
图3为本申请实施例中提供的计算机可读存储介质的结构示意图;
图4为本申请实施例中提供的计算机设备的结构示意图。
具体实施方式
本申请实施例提供了一种纹理共享方法、计算机设备和存储介质,可以实现采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
在Windows操作系统的图形渲染API中,有OpenGL与D3D,OpenGL又分为桌面版本与移动嵌入式版本,其中桌面版本在Windows上称之为WGL,而移动嵌入式版本OpenGL ES是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。Direct3DDirect 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API。它是由微软(Microsoft)一手树立的3D API规范,微软公司拥有该库版权,它所有的语法定义包含在微软提供的程序开发组件的帮助文件、源代码中。Direct3D是微软公司DirectXSDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。根据其主版本的不同,又分为Direct3D9,Direct3D10,Direct3D11以及Direct3D12等。EGL是图形渲染API,是OpenGL ES和底层Native平台视窗系统之间的接口,保证了OpenGL ES的平台独立性。EGL提供了若干功能:创建rendering surface、创建graphicscontext、同步应用程序和本地平台渲染API、提供对显示设备的访问、提供对渲染配置的管理等。在基于OpenGL ES下,提出了ANGLE(Almost Native Graphic Layer Engine,几乎本地图形层引擎)的概念,也就是利用本地Direct3D的接口,来实现OpenGL的接口函数。那么基于ANGLE的EGL实现,虽然在使用的时候调用的是OpenGL的标准接口,但是其内部实现却是Direct3D。那么基于这一特性,本实施例可以在两个进程间,实现EGL与Direct3D9的纹理互操作在不支持WGL_NV_Interop扩展的WGL中进行。另外,在以多进程方式进行解码的播放器框架中,一个播放器系统包含有两个进程,一个是用户可见的播放器主控进程,一个是用户不可见的后台解码进程解码进程。其中解码进程负责音视频的解码,主控进程负责视频的绘制,本申请实施例以主控进程为dy_PCClient进程,解码进程为RpcMediaDecoder进程,二者通过RPC连接的网络框架为例进行介绍,并不用于限定本申请。可以理解的是,本申请实施例使用的函数名称或变量名称等,并不用于限定本申请,在一些其他可能的实现方式中,也可以使用其他命名方式。
本申请实施例的技术方案为解决上述技术问题,总体思路如下:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
可见,本申请实施例通过在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。实现了采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
为了更好的理解上述技术方案,以下结合附图以及具体实施例,对上述技术方案进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例一:
请参阅图1,本实施例提供的一种纹理共享方法包括以下步骤:
S101、在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
具体的,在RpcMediaDecoder解码进程中,创建第一共享纹理并获取所述第一共享纹理的句柄的步骤如下:
(1)获取硬件解码后输出的IDirect3DSurface9接口。
本实施例中,RpcMediaDecoder解码进程采用与Direct3D9进行硬件解码,解码完成后生成的图像是以IDirect3DSurface9的形式存在的,可以通过IDirect3DSurface9接口获取到解码后的图像信息。
(2)创建Direct3D9第一共享纹理并获取第一共享纹理的句柄;
调用RpcMediaDecoder解码进程中用于硬件解码的IDirect3DDevice9接口的CreateRenderTarget方法,先在该方法中声明一个初始值为0的整型变量sharedHandle,并将该变量传入到该方法的最后一个参数中,调用该方法成功之后,就创建了Direct3D9第一共享纹理,并获取到所述第一共享纹理的句柄。
(3)拷贝图像信息。
通过调用上述创建的第一共享纹理的GetSurfaceLevel接口,获取到该纹理的表面接口IDirect3DSurface9,再通过调用IDirect3DDevice9接口的StretchRect方法,将IDirect3DSurface9接口获取到图像信息,拷贝到第一共享纹理中。
上述步骤完成了创建第一共享纹理并获取所述第一共享纹理的句柄,然后,RpcMediaDecoder解码进程将所述第一共享纹理的句柄传递给主控进程dy_PCClient,具体的,可以通过向所述主控进程dy_PCClient发送绘制消息,所述绘制消息包括所述第一共享纹理的句柄,从而将第一共享纹理的句柄传递给主控进程dy_PCClient。
S102、在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
本实施例中,主控进程dy_PCClient使用OpenGL的移动嵌入式版本OpenGL ES进行图像绘制,而EGL是OpenGL ES和底层Native平台视窗系统之间的接口。在EGL的使用中,必须先初始化EGL。具体的,在dy_PCClient主控进程中初始化EGL的步骤包括:
(1)创建OpenGL ES显示结构EGLDisplay;
因为本实施例需要与Direct3D9进行互操作,所以创建的EGLDisplay显示结构必须是基于Direct3D9实现的。具体的步骤如下:
a.获取eglGetPlatformDisplayEXT扩展,通过调用EGL的eglGetProcAddress函数,将eglGetPlatformDisplayEXT字符串传入到该函数中,从而获取到eglGetPlatformDisplayEXT函数的地址;
b.调用eglGetPlatformDisplayEXT函数创建EGLDisplay显示结构,具体为根据获取到的eglGetPlatformDisplayEXT函数地址,调用该函数创建EGLDisplay结构。其中,在调用该函数时,将EGL_PLATFORM_ANGLE_ANGLE传入到该函数的第一个参数中,EGL_PLATFORM_ANGLE_ANGLE为该EGL的硬件平台,将EGL_DEFAULT_DISPLAY传入到该函数的第二个参数中,EGL_DEFAULT_DISPLAY为默认的显示器,将该函数的第三个参数中设置为一个以EGL_NONE结尾的整型数组,并且在该数组中包含以EGL_PLATFORM_ANGLE_TYPE_ANGLE为键,以EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE为值的键值对。如果该函数调用成功,那么将返回一个EGLDisplay显示结构。
(2)创建OpenGL ES配置结构EGLConfig;
基于上述步骤创建的EGLDisplay显示结构,可以创建一个EGLConfig配置结构。具体的,可以通过调用eglChooseConfig函数创建EGLConfig配置结构。由于在EGL中存在三种不同类型的EGLSurface,一是Window Surface,即前台纹理,跟具体的物理显示设备绑定,例如Windows系统上的窗口句柄;二是PBuffer Surface,即位于显存中的后台纹理;三是Pixmap Surface,即位于系统内存中的位图纹理,本实施例中所需要的纹理,是位于显存中的后台纹理,所以在调用eglChooseConfig创建EGLConfig配置结构时,必须同样提供一个以EGL_NONE结束的整型数组,并且该数组中必须包含以EGL_SURFACE_TYPE为键,以EGL_PBUFFER_BIT为值的键值对。调用完成之后,如果该函数调用成功,将获取到一个类型为EGLConfig配置结构。
(3)创建OpenGL ES纹理结构EGLSurface;
Surface实际上就是一个FrameBuffer(帧缓冲),获取到EGLConfig配置结构之后,可以调用eglCreatePbufferSurface接口来创建一个EGLSurface后台纹理。其中在调用eglCreatePbufferSurface接口时,将所述EGLDisplay传入到该函数的第一个参数中,将所述EGLConfig传入到该函数的第二个参数中,并且在该函数的第三个参数中,同样提供一个以EGL_NONE结尾的整型数组,该数组中必须包含以EGL_WIDTH纹理宽度为键,具体纹理宽度值为值;以EGL_HEIGHT纹理高度为键,具体纹理高度为值;以EGL_TEXTURE_FORMAT为键,以EGL_TEXTURE_RGB为值;以EGL_TEXTURE_TARGET为键,以EGL_TEXTURE_2D为值的键值对信息。该函数调用成功之后,将获取到EGLSurface结构。
(4)获取纹理结构EGLSurface的共享纹理句柄。
具体的,获取所述EGLSurface纹理结构的共享纹理句柄,具体的步骤如下:
a.获取eglQuerySurfacePointerANGLE扩展函数;
具体的,通过调用eglGetProcAddress,将eglQuerySurfacePointerANGLE字符串传入到该函数中,获取到eglQuerySurfacePointerANGLE扩展函数的地址。
b.调用eglQuerySurfacePointerANGLE获取共享纹理句柄。
根据获取到的eglQuerySurfacePointerANGLE扩展函数地址,调用该函数,并将创建的EGLDisplay传入到该函数第一个参数中,将创建的EGLSurface传入到第二个参数中,将EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE传入到第三个参数中,将第四个参数设置为用于接收纹理句柄值。该函数调用成功之后,将获取到所述EGLSurface纹理结构的共享纹理句柄。
以上步骤完成了在dy_PCClient主控进程中创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以下为基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理具体的步骤:
(1)创建IDirect3D9Ex接口;
具体的,通过调用Direct3DCreate9Ex创建一个IDirect3D9Ex的接口。所述IDirect3D9EX接口的方法可以用来创建微软Direct3D 9EX对象并设置环境。此接口包括枚举和检索设备功能的方法。
(2)创建IDirect3DDevice9Ex接口;
基于IDirect3D9Ex接口,调用该接口的CreateDeviceEx方法,创建一个IDirect3DDevice9Ex的接口。所述IDirect3DDevice9Ex接口的方法可以用来渲染原语、创建资源、使用系统级变量工作、调整伽马斜坡级别、使用调色板和创建着色器。
(3)创建第二共享纹理;
通过调用创建的IDirect3DDevice9Ex的CreateTexture方法,将要创建的纹理宽度值设置为该方法第一个参数,将纹理的高度值设置为该方法第二个参数,其中,要创建的纹理的宽度值和纹理的高度值与所述EGLSurface纹理结构中设置的纹理的宽度值和纹理的高度值一致,将纹理层级值1设置到该方法的第三个参数中,将D3DUSAGE_RENDERTARGET值设置到该方法第四个参数中,将D3DPOOL_DEFAULT设置到该方法的第五个参数中,将第六个参数设置为用于接收要创建的IDirect3DTexture9接口,将第七个参数值设置为OpenGLES纹理结构EGLSurface的共享纹理句柄。该函数调用成功后,就创建了第二共享纹理IDirect3DTexture9。这样创建出来的IDirect3DTexture9接口与EGLSurface纹理结构指向了同一地址的显存,从而建立起二者的共享关系。
需要说明的是,dy_PCClient主控进程与RpcMediaDecoder解码进程通过RPC进行连接。dy_PCClient主控进程通过调用RpcRegisterProcedure函数将draw_video函数注册到RPC中,以使得当解码进程RpcMediaDecoder解码完一帧视频后,可以通过调用RpcCallProcedure函数来调用dy_PCClient主控进程的draw_video方法向主控进程发送绘制消息,通知dy_PCClient主控进程进行图像绘制。
dy_PCClient主控进程接收到绘制消息后,进入到响应draw_video处理过程中,具体包括:
(1)打开第一共享纹理;
调用初始化Direct3D9中创建的IDirect3DDevice9接口的CreateRenderTarget方法,将draw_video RPC处理函数中由RpcMediaDecoder传递过来的第一共享纹理共柄sharedHandle传入到该方法的最后一个参数中,从而在dy_PCClient主控进程中打开RpcMediaDecoder解码进程中所创建的第一共享纹理。
(2)将第一共享纹理拷贝到第二共享纹理;
因为在dy_PCClient主控进程中采用的是利用OpenGL ES进行图像绘制,所以需要调用IDirect3DDevice9接口的StretchRect方法,将来自RpcMediaDecoder解码进程的第一共享纹理拷贝到第二共享纹理中。
(3)显存同步。
由于调用IDirect3DDevice9接口的StretchRect方法,将来自RpcMediaDecoder解码进程的第一共享纹理拷贝到第二共享纹理是GPU异步执行的,所以通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理之前,需要判断是否已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理。具体包括:
通过所述dy_PCClient主控进程创建IDirect3DQuery9接口,具体的,通过调用IDirect3DDevice9接口的CreateQuery方法,将D3DQUERYTYPE_EVENT设置到该方法的第一个参数中,从而获取到该接口;
通过所述dy_PCClient主控进程基于所述IDirect3DQuery9接口发起query查询请求,具体的,通过调用上述创建的IDirect3DQuery9接口的Issure方法,将D3DISSUE_END设置到该方法的第一个参数中,从而发起一个查询结束事件请求;
通过调用IDirect3DQuery9接口的GetData方法判断query查询请求是否完成,若是,该函数的返回值为S_OK,则确定已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理,查询请求完成后,可以退出该步骤;若否,则继续调用GetData方法,直到该方法返回S_OK为止。
确定已完成将所述第一共享纹理拷贝到所述第二共享纹理后,通过所述OpenGLES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理,由于第一共享纹理中包括RpcMediaDecoder解码的图像信息,OpenGL ES可以获取到RpcMediaDecoder解码的图像信息,然后可以对所述图像进行绘制。具体的,可以通过调用eglBindTexImage函数分别将EGLDisplay显示结构,EGLSurface配置结构以及EGL_BACK_BUFFER值,传入到该函数的三个参数中,从而完成图像绘制。
可见,本实施例中,通过在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。实现了采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展时,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
基于同一发明构思,本申请提供了一种纹理共享装置,详见图2,下面将结合图2对实施例二进行介绍。
实施例二:
请参阅图2,本实施例提供的纹理共享装置包括:
第一初始化单元201,用于在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;
第二初始化单元202,用于在主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;
传递单元203,用于通过所述解码进程将所述第一共享纹理的句柄传递给所述主控进程;
拷贝单元204,用于通过所述主控进程根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;
获取单元205,用于在所述主控进程中,通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
可见,本实施例实现了采用OpenGL ES进行视频图像绘制的主控进程与采用DXVA与Direct3D9进行硬件解码的解码进程之间的纹理共享,避免了桌面版本的OpenGL不支持NV_DX_Interop扩展,在使用OpenGL绘制IDirect3DTexture9纹理时,必须先把IDirect3DTexture9纹理中,位于显存中的图像内容拷贝到系统内存中导致的开销大,效率低的问题。
本申请实施例二提供的纹理共享装置及本申请实施例一提供的纹理共享方法属于同一构思,其具体实现过程详见说明书全文,此处不再赘述。
基于同一发明构思,本申请提供了一种计算机可读存储介质,详见图3,下面将结合图3对实施例三进行介绍。
实施例三:
本实施例提供了一种计算机可读存储介质300,所述计算机可读存储介质300存储有计算机程序311,所述计算机程序311被处理器执行时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
在具体实施过程中,该计算机程序311被处理器执行时,可以实现实施例一中任一实施方式。
基于同一发明构思,本申请还提供了一种计算机设备,详见图4,下面将结合图4对实施例四进行介绍。
实施例四:
本申请提供了一种计算机设备400,包括处理器420、存储器410以及存储在存储器410上并可在处理器420上运行的计算机程序411,所述处理器420执行所述计算机程序411时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
由于本实施例所介绍的计算机设备400为实施本申请实施例一中纹理共享方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备400的具体实施方式以及其各种变化形式,所以在此对于该计算机设备400如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种纹理共享方法,其特征在于,所述方法包括:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
2.如权利要求1所述的方法,其特征在于,所述在所述主控进程中,通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理之前,所述方法还包括:
判断是否已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理,若是,则执行通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理的步骤。
3.如权利要求1所述的方法,其特征在于,所述在解码进程中,将所述第一共享纹理的句柄传递给主控进程,包括:
向所述主控进程发送绘制消息,所述绘制消息包括所述第一共享纹理的句柄。
4.如权利要求1-3任一项所述的方法,其特征在于,所述主控进程与所述解码进程通过RPC进行连接。
5.一种纹理共享装置,其特征在于,所述装置包括:
第一初始化单元,用于在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;
第二初始化单元,用于在主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;
传递单元,用于通过所述解码进程将所述第一共享纹理的句柄传递给所述主控进程;
拷贝单元,用于通过所述主控进程根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;
获取单元,用于在所述主控进程中,通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
6.如权利要求5所述的装置,其特征在于,所述装置还包括:
显存同步单元,用于判断所述主控进程是否已完成根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理,若是,则执行所述获取单元的步骤。
7.如权利要求5所述的装置,其特征在于,所述传递单元具体用于:
通过所述解码进程向所述主控进程发送绘制消息,所述绘制消息包括所述第一共享纹理的句柄。
8.如权利要求1-3任一项所述的装置,其特征在于,所述主控进程与所述解码进程通过RPC进行连接。
9.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
10.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
在解码进程中,创建Direct3D9第一共享纹理并获取所述第一共享纹理的句柄,所述第一共享纹理包括所述解码进程解码的图像信息;将所述第一共享纹理的句柄传递给主控进程;
在所述主控进程中,创建OpenGL ES纹理结构并获取所述纹理结构的共享纹理句柄,以及基于所述纹理结构的共享纹理句柄创建Direct3D9第二共享纹理;根据所述第一共享纹理的句柄将所述第一共享纹理拷贝到所述第二共享纹理;通过所述OpenGL ES根据所述纹理结构的共享纹理句柄获取所述第二共享纹理,从而获取所述第一共享纹理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810458365.7A CN108733356B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810458365.7A CN108733356B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108733356A true CN108733356A (zh) | 2018-11-02 |
CN108733356B CN108733356B (zh) | 2022-12-02 |
Family
ID=63938309
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810458365.7A Active CN108733356B (zh) | 2018-05-14 | 2018-05-14 | 一种纹理共享方法、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108733356B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110321193A (zh) * | 2019-05-05 | 2019-10-11 | 四川盛趣时代网络科技有限公司 | 一种基于Direct3D共享纹理的交互方法及系统 |
CN114268796A (zh) * | 2021-12-22 | 2022-04-01 | 天翼云科技有限公司 | 视频流处理的方法及装置 |
CN116257294A (zh) * | 2023-01-17 | 2023-06-13 | 成都曾自科技有限公司 | 一种跨进程的独立云渲染方法、装置、设备及存储介质 |
WO2023216621A1 (zh) * | 2022-05-13 | 2023-11-16 | 华为云计算技术有限公司 | 云桌面的图像处理方法、装置、服务器和存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140033219A1 (en) * | 2012-07-24 | 2014-01-30 | Mstar Semiconductor, Inc. | Method, apparatus and computer for loading resource file for game engine |
CN105302580A (zh) * | 2015-11-28 | 2016-02-03 | 武汉斗鱼网络科技有限公司 | 一种通过gpu纹理共享实现快速获取游戏图像的方法和系统 |
CN106528303A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种基于gpu纹理共享来获取d3d12游戏源图像的方法及系统 |
CN106649037A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种gpu任务完成状态的判断方法及装置 |
CN107484011A (zh) * | 2017-10-09 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 一种视频资源解码方法及装置 |
-
2018
- 2018-05-14 CN CN201810458365.7A patent/CN108733356B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140033219A1 (en) * | 2012-07-24 | 2014-01-30 | Mstar Semiconductor, Inc. | Method, apparatus and computer for loading resource file for game engine |
CN105302580A (zh) * | 2015-11-28 | 2016-02-03 | 武汉斗鱼网络科技有限公司 | 一种通过gpu纹理共享实现快速获取游戏图像的方法和系统 |
CN106528303A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种基于gpu纹理共享来获取d3d12游戏源图像的方法及系统 |
CN106649037A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种gpu任务完成状态的判断方法及装置 |
CN107484011A (zh) * | 2017-10-09 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 一种视频资源解码方法及装置 |
Non-Patent Citations (6)
Title |
---|
GOOGLE: "EGL_ANGLE_query_surface_pointer.txt", 《HTTPS://CHROMIUM.GOOGLESOURCE.COM/ANGLE/ANGLE/+/REFS/HEADS/MAIN/EXTENSIONS/EGL_ANGLE_QUERY_SURFACE_POINTER.TXT》 * |
JON LEECH: "Khronos Native Platform Graphics Interface(EGL Version 1.4 - December 4, 2013)", 《HTTPS://WWW.KHRONOS.ORG/REGISTRY/EGL/SPECS/EGLSPEC.1.4.PDF》 * |
KJ1: "ofxSpout2/libs/src/SpoutDirectX.cpp", 《HTTPS://GITHUB.COM/KJ1/OFXSPOUT2/BLOB/MASTER/LIBS/SRC/SPOUTDIRECTX.CPP》 * |
MICROSOFT DOCS: "Direct3DCreate9Ex", 《HTTPS://DOCS.MICROSOFT.COM/EN-US/PREVIOUS-VERSIONS/MS681823(V=VS.85)》 * |
MICROSOFT DOCS: "IDirect3DDevice9Ex::CheckDeviceState", 《HTTPS://DOCS.MICROSOFT.COM/EN-US/PREVIOUS-VERSIONS/MS681835(V=VS.85)》 * |
PATRICK COZZI等: "OpenGL Insights", 《HTTPS://WWW.SEAS.UPENN.EDU/~PCOZZI/OPENGLINSIGHTS/OPENGLINSIGHTS-ANGLE.PDF》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110321193A (zh) * | 2019-05-05 | 2019-10-11 | 四川盛趣时代网络科技有限公司 | 一种基于Direct3D共享纹理的交互方法及系统 |
CN114268796A (zh) * | 2021-12-22 | 2022-04-01 | 天翼云科技有限公司 | 视频流处理的方法及装置 |
WO2023216621A1 (zh) * | 2022-05-13 | 2023-11-16 | 华为云计算技术有限公司 | 云桌面的图像处理方法、装置、服务器和存储介质 |
CN116257294A (zh) * | 2023-01-17 | 2023-06-13 | 成都曾自科技有限公司 | 一种跨进程的独立云渲染方法、装置、设备及存储介质 |
CN116257294B (zh) * | 2023-01-17 | 2024-01-26 | 成都曾自科技有限公司 | 一种跨进程的独立云渲染方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108733356B (zh) | 2022-12-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108733356A (zh) | 一种纹理共享方法、计算机设备和存储介质 | |
JP6073533B1 (ja) | タイルベースのアーキテクチャ上での最適化されたマルチパスレンダリング | |
US20100289804A1 (en) | System, mechanism, and apparatus for a customizable and extensible distributed rendering api | |
CN103530018B (zh) | 安卓操作系统中微件界面的建立方法及移动终端 | |
US9715750B2 (en) | System and method for layering using tile-based renderers | |
JP5805864B2 (ja) | グラフィックスレンダリングエンジンおよびその実施方法 | |
US9396564B2 (en) | Atlas generation based on client video configuration | |
US8654134B2 (en) | Command remoting | |
CN105427366B (zh) | 一种图像渲染方法和图像渲染系统 | |
CN102707986A (zh) | 子分区与父分区之间的共享存储器 | |
CN111488196A (zh) | 渲染方法及装置、存储介质、处理器 | |
CN112057851A (zh) | 一种基于多显卡的单帧画面实时渲染方法 | |
CN113515396A (zh) | 图形渲染方法、装置、电子设备与存储介质 | |
CN108595284A (zh) | 一种纹理共享方法、计算机设备和存储介质 | |
TW202103111A (zh) | 用於圖形處理之資產感知計算架構 | |
WO2022033162A1 (zh) | 一种模型加载方法以及相关装置 | |
CN101650822B (zh) | 交互信息生成方法及系统 | |
CN113379588A (zh) | 容器应用的渲染系统 | |
US8203567B2 (en) | Graphics processing method and apparatus implementing window system | |
CN107728997A (zh) | 一种视频播放器渲染系统 | |
WO2018175299A1 (en) | System and method for rendering shadows for a virtual environment | |
CN102239484B (zh) | 经改进的命令遥控技术 | |
CN111243069B (zh) | 一种Unity3D引擎的场景切换方法和系统 | |
US20050140692A1 (en) | Interoperability between immediate-mode and compositional mode windows | |
CN201540593U (zh) | 交互信息生成系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |