diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2023-05-02 11:37:57 +0400 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2023-06-07 14:12:40 +0400 |
commit | 6b7024989e9c9934e4f3b1adaf923c3b2a119774 (patch) | |
tree | 8f0def8c1aa99a90855ac190951fd6355b1dd897 /src | |
parent | d708b6d194ac6182190cd36ce53b0754324c7783 (diff) |
egl: add D3D helper functions
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Acked-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1103>
Diffstat (limited to 'src')
-rw-r--r-- | src/vrend_winsys_egl.c | 89 | ||||
-rw-r--r-- | src/vrend_winsys_egl.h | 11 |
2 files changed, 100 insertions, 0 deletions
diff --git a/src/vrend_winsys_egl.c b/src/vrend_winsys_egl.c index 0ac8b6a..e5fcbe9 100644 --- a/src/vrend_winsys_egl.c +++ b/src/vrend_winsys_egl.c @@ -455,6 +455,95 @@ void virgl_egl_destroy(struct virgl_egl *egl) free(egl); } +#ifdef WIN32 +static void +debug_hresult(HRESULT hr) +{ + LPSTR msg = NULL; + + if (SUCCEEDED(hr)) + return; + + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + hr, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&msg, + 0, + NULL); + + VREND_DEBUG(dbg_d3d, NULL, "0x%08lX: %s", hr, msg); + + LocalFree(msg); +} + +static void debug_d3d_texture_desc(const D3D11_TEXTURE2D_DESC *desc) +{ + VREND_DEBUG(dbg_d3d, NULL, + "D3D11_TEXTURE2D_DESC:\n" + " Width: %u\n" + " Height: %u\n" + " MipLevels: %u\n" + " ArraySize: %u\n" + " Format: %u\n" + " SampleDesc.Count: %u\n" + " SampleDesc.Quality: %u\n" + " Usage: %u\n" + " BindFlags: 0x%x (%u)\n" + " CPUAccessFlags: 0x%x (%u)\n" + " MiscFlags: 0x%x (%u)\n", + desc->Width, + desc->Height, + desc->MipLevels, + desc->ArraySize, + desc->Format, + desc->SampleDesc.Count, + desc->SampleDesc.Quality, + desc->Usage, + desc->BindFlags, desc->BindFlags, + desc->CPUAccessFlags, desc->CPUAccessFlags, + desc->MiscFlags, desc->MiscFlags); +} + +bool virgl_egl_win32_create_d3d11_texture2d(struct virgl_egl *egl, + const D3D11_TEXTURE2D_DESC *desc, ID3D11Texture2D **tex) +{ + HRESULT hr; + + if (!egl || !egl->d3d11_device) + return false; + + debug_d3d_texture_desc(desc); + hr = egl->d3d11_device->lpVtbl->CreateTexture2D(egl->d3d11_device, desc, NULL, tex); + if (FAILED(hr)) { + debug_hresult(hr); + return false; + } + + return true; +} + +EGLImageKHR +virgl_egl_win32_image_from_d3d11_texture2d(struct virgl_egl *egl, ID3D11Texture2D *tex) +{ + const EGLint attribs[] = { + EGL_NONE + }; + + if (!egl) + return NULL; + +#ifndef EGL_D3D11_TEXTURE_ANGLE +#define EGL_D3D11_TEXTURE_ANGLE 0x3484 +#endif + + return eglCreateImageKHR(egl->egl_display, EGL_NO_CONTEXT, + EGL_D3D11_TEXTURE_ANGLE, (EGLClientBuffer)tex, + attribs); +} +#endif + static void virgl_egl_win32_init(UNUSED struct virgl_egl *egl) { diff --git a/src/vrend_winsys_egl.h b/src/vrend_winsys_egl.h index 9db777c..919681d 100644 --- a/src/vrend_winsys_egl.h +++ b/src/vrend_winsys_egl.h @@ -29,6 +29,10 @@ #include <epoxy/egl.h> +#ifdef WIN32 +#include <d3d11.h> +#endif + struct virgl_egl; #ifdef ENABLE_GBM @@ -90,4 +94,11 @@ bool virgl_egl_export_signaled_fence(struct virgl_egl *egl, int *out_fd); bool virgl_egl_export_fence(struct virgl_egl *egl, EGLSyncKHR fence, int *out_fd); bool virgl_egl_different_gpu(struct virgl_egl *egl); const char *virgl_egl_error_string(EGLint error); + +#ifdef WIN32 +bool virgl_egl_win32_create_d3d11_texture2d(struct virgl_egl *egl, + const D3D11_TEXTURE2D_DESC *desc, ID3D11Texture2D **tex); +EGLImageKHR virgl_egl_win32_image_from_d3d11_texture2d(struct virgl_egl *egl, ID3D11Texture2D *tex); +#endif + #endif |