Add support for windows SwapChainPanel in SwapChain and Surface
Add SurfaceDescriptorFromWindowsSwapChainPanel structure in codegen. Add WindowsSwapChainPanel surface type. Add support for WindowsSwapChainPanel surface in SwapChain. Bug: dawn:766 Change-Id: I1d59262b912ee445c90a7ec6e22b442f2fb1bf00 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/53840 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
parent
9c375faf4c
commit
11379a3b59
11
dawn.json
11
dawn.json
|
@ -1784,6 +1784,14 @@
|
|||
{"name": "core window", "type": "void", "annotation": "*"}
|
||||
]
|
||||
},
|
||||
"surface descriptor from windows swap chain panel": {
|
||||
"category": "structure",
|
||||
"chained": true,
|
||||
"javascript": false,
|
||||
"members": [
|
||||
{"name": "swap chain panel", "type": "void", "annotation": "*"}
|
||||
]
|
||||
},
|
||||
"swap chain": {
|
||||
"category": "object",
|
||||
"methods": [
|
||||
|
@ -1827,7 +1835,8 @@
|
|||
{"value": 7, "name": "primitive depth clamping state"},
|
||||
{"value": 8, "name": "surface descriptor from windows core window"},
|
||||
{"value": 9, "name": "external texture binding entry"},
|
||||
{"value": 10, "name": "external texture binding layout"}
|
||||
{"value": 10, "name": "external texture binding layout"},
|
||||
{"value": 11, "name": "surface descriptor from windows swap chain panel"}
|
||||
]
|
||||
},
|
||||
"texture": {
|
||||
|
|
|
@ -141,7 +141,8 @@
|
|||
"SurfaceDescriptorFromMetalLayer",
|
||||
"SurfaceDescriptorFromWindowsHWND",
|
||||
"SurfaceDescriptorFromXlib",
|
||||
"SurfaceDescriptorFromWindowsCoreWindow"
|
||||
"SurfaceDescriptorFromWindowsCoreWindow",
|
||||
"SurfaceDescriptorFromWindowsSwapChainPanel"
|
||||
],
|
||||
"client_side_commands": [
|
||||
"BufferMapAsync",
|
||||
|
|
|
@ -32,4 +32,7 @@
|
|||
// Macros defined to produce compiler intrinsics
|
||||
#undef MemoryBarrier
|
||||
|
||||
// Macro defined as an alias of GetTickCount
|
||||
#undef GetCurrentTime
|
||||
|
||||
#endif // COMMON_WINDOWS_WITH_UNDEFS_H_
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||
# include <windows.ui.core.h>
|
||||
# include <windows.ui.xaml.controls.h>
|
||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||
|
||||
#if defined(DAWN_USE_X11)
|
||||
|
@ -43,6 +44,7 @@ namespace dawn_native {
|
|||
wgpu::SType::SurfaceDescriptorFromMetalLayer,
|
||||
wgpu::SType::SurfaceDescriptorFromWindowsHWND,
|
||||
wgpu::SType::SurfaceDescriptorFromWindowsCoreWindow,
|
||||
wgpu::SType::SurfaceDescriptorFromWindowsSwapChainPanel,
|
||||
wgpu::SType::SurfaceDescriptorFromXlib));
|
||||
|
||||
#if defined(DAWN_ENABLE_BACKEND_METAL)
|
||||
|
@ -80,6 +82,18 @@ namespace dawn_native {
|
|||
}
|
||||
return {};
|
||||
}
|
||||
const SurfaceDescriptorFromWindowsSwapChainPanel* swapChainPanelDesc = nullptr;
|
||||
FindInChain(descriptor->nextInChain, &swapChainPanelDesc);
|
||||
if (swapChainPanelDesc) {
|
||||
// Validate the swapChainPanel by querying for ISwapChainPanel interface
|
||||
ComPtr<ABI::Windows::UI::Xaml::Controls::ISwapChainPanel> swapChainPanel;
|
||||
if (swapChainPanelDesc->swapChainPanel == nullptr ||
|
||||
FAILED(static_cast<IUnknown*>(swapChainPanelDesc->swapChainPanel)
|
||||
->QueryInterface(IID_PPV_ARGS(&swapChainPanel)))) {
|
||||
return DAWN_VALIDATION_ERROR("Invalid SwapChainPanel");
|
||||
}
|
||||
return {};
|
||||
}
|
||||
return DAWN_VALIDATION_ERROR("Unsupported sType");
|
||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||
|
||||
|
@ -114,10 +128,12 @@ namespace dawn_native {
|
|||
const SurfaceDescriptorFromMetalLayer* metalDesc = nullptr;
|
||||
const SurfaceDescriptorFromWindowsHWND* hwndDesc = nullptr;
|
||||
const SurfaceDescriptorFromWindowsCoreWindow* coreWindowDesc = nullptr;
|
||||
const SurfaceDescriptorFromWindowsSwapChainPanel* swapChainPanelDesc = nullptr;
|
||||
const SurfaceDescriptorFromXlib* xDesc = nullptr;
|
||||
FindInChain(descriptor->nextInChain, &metalDesc);
|
||||
FindInChain(descriptor->nextInChain, &hwndDesc);
|
||||
FindInChain(descriptor->nextInChain, &coreWindowDesc);
|
||||
FindInChain(descriptor->nextInChain, &swapChainPanelDesc);
|
||||
FindInChain(descriptor->nextInChain, &xDesc);
|
||||
ASSERT(metalDesc || hwndDesc || xDesc);
|
||||
if (metalDesc) {
|
||||
|
@ -131,6 +147,11 @@ namespace dawn_native {
|
|||
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||
mType = Type::WindowsCoreWindow;
|
||||
mCoreWindow = static_cast<IUnknown*>(coreWindowDesc->coreWindow);
|
||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||
} else if (swapChainPanelDesc) {
|
||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||
mType = Type::WindowsSwapChainPanel;
|
||||
mSwapChainPanel = static_cast<IUnknown*>(swapChainPanelDesc->swapChainPanel);
|
||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||
} else if (xDesc) {
|
||||
mType = Type::Xlib;
|
||||
|
@ -187,6 +208,15 @@ namespace dawn_native {
|
|||
#endif
|
||||
}
|
||||
|
||||
IUnknown* Surface::GetSwapChainPanel() const {
|
||||
ASSERT(mType == Type::WindowsSwapChainPanel);
|
||||
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||
return mSwapChainPanel.Get();
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
|
||||
void* Surface::GetXDisplay() const {
|
||||
ASSERT(mType == Type::Xlib);
|
||||
return mXDisplay;
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace dawn_native {
|
|||
NewSwapChainBase* GetAttachedSwapChain();
|
||||
|
||||
// These are valid to call on all Surfaces.
|
||||
enum class Type { MetalLayer, WindowsHWND, WindowsCoreWindow, Xlib };
|
||||
enum class Type { MetalLayer, WindowsHWND, WindowsCoreWindow, WindowsSwapChainPanel, Xlib };
|
||||
Type GetType() const;
|
||||
InstanceBase* GetInstance();
|
||||
|
||||
|
@ -64,6 +64,9 @@ namespace dawn_native {
|
|||
// Valid to call if the type is WindowsCoreWindow
|
||||
IUnknown* GetCoreWindow() const;
|
||||
|
||||
// Valid to call if the type is WindowsSwapChainPanel
|
||||
IUnknown* GetSwapChainPanel() const;
|
||||
|
||||
// Valid to call if the type is WindowsXlib
|
||||
void* GetXDisplay() const;
|
||||
uint32_t GetXWindow() const;
|
||||
|
@ -87,6 +90,9 @@ namespace dawn_native {
|
|||
#if defined(DAWN_PLATFORM_WINDOWS)
|
||||
// WindowsCoreWindow
|
||||
ComPtr<IUnknown> mCoreWindow;
|
||||
|
||||
// WindowsSwapChainPanel
|
||||
ComPtr<IUnknown> mSwapChainPanel;
|
||||
#endif // defined(DAWN_PLATFORM_WINDOWS)
|
||||
|
||||
// Xlib
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include <dawn/dawn_wsi.h>
|
||||
|
||||
#include <windows.ui.xaml.media.dxinterop.h>
|
||||
|
||||
namespace dawn_native { namespace d3d12 {
|
||||
namespace {
|
||||
|
||||
|
@ -261,6 +263,19 @@ namespace dawn_native { namespace d3d12 {
|
|||
"Creating the IDXGISwapChain1"));
|
||||
break;
|
||||
}
|
||||
case Surface::Type::WindowsSwapChainPanel: {
|
||||
DAWN_TRY(CheckHRESULT(
|
||||
factory2->CreateSwapChainForComposition(device->GetCommandQueue().Get(),
|
||||
&swapChainDesc, nullptr, &swapChain1),
|
||||
"Creating the IDXGISwapChain1"));
|
||||
ComPtr<ISwapChainPanelNative> swapChainPanelNative;
|
||||
DAWN_TRY(CheckHRESULT(GetSurface()->GetSwapChainPanel()->QueryInterface(
|
||||
IID_PPV_ARGS(&swapChainPanelNative)),
|
||||
"Getting ISwapChainPanelNative"));
|
||||
DAWN_TRY(CheckHRESULT(swapChainPanelNative->SetSwapChain(swapChain1.Get()),
|
||||
"Setting SwapChain"));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue