summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2023-05-02 11:37:57 +0400
committerMarc-André Lureau <marcandre.lureau@redhat.com>2023-06-07 14:12:40 +0400
commit6b7024989e9c9934e4f3b1adaf923c3b2a119774 (patch)
tree8f0def8c1aa99a90855ac190951fd6355b1dd897 /src
parentd708b6d194ac6182190cd36ce53b0754324c7783 (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.c89
-rw-r--r--src/vrend_winsys_egl.h11
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