mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-19 13:03:43 +00:00
The state-tracking of the webgpu.h swapchain is a bit complicated because contrary to implementation-based swapchains, they have more guarantees and a "replacing mechanism". For example instead of hoping the implementation-based swapchain resize automatically, the surface-based swapchain needs to be replaced by a new swapchain and invalidated. This mechanism of invalidation also needs to be triggered when the last reference to the surface is lost because we don't want to risk the application destroying the window from under us. Adds tests for all the cases of invalidation I could think of apart from device loss. Bug: dawn:269 Change-Id: Id515dbb640e13c6e30bb1f1e93b8e54f1e2bba4b Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/15400 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
// Copyright 2020 The Dawn Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef DAWNNATIVE_SURFACE_H_
|
|
#define DAWNNATIVE_SURFACE_H_
|
|
|
|
#include "dawn_native/Error.h"
|
|
#include "dawn_native/Forward.h"
|
|
#include "dawn_native/RefCounted.h"
|
|
|
|
#include "dawn_native/dawn_platform.h"
|
|
|
|
namespace dawn_native {
|
|
|
|
MaybeError ValidateSurfaceDescriptor(const InstanceBase* instance,
|
|
const SurfaceDescriptor* descriptor);
|
|
|
|
// A surface is a sum types of all the kind of windows Dawn supports. The OS-specific types
|
|
// aren't used because they would cause compilation errors on other OSes (or require
|
|
// ObjectiveC).
|
|
// The surface is also used to store the current swapchain so that we can detach it when it is
|
|
// replaced.
|
|
class Surface final : public RefCounted {
|
|
public:
|
|
Surface(InstanceBase* instance, const SurfaceDescriptor* descriptor);
|
|
~Surface();
|
|
|
|
void SetAttachedSwapChain(NewSwapChainBase* swapChain);
|
|
NewSwapChainBase* GetAttachedSwapChain() const;
|
|
|
|
// These are valid to call on all Surfaces.
|
|
enum class Type { MetalLayer, WindowsHWND, Xlib };
|
|
Type GetType() const;
|
|
InstanceBase* GetInstance();
|
|
|
|
// Valid to call if the type is MetalLayer
|
|
void* GetMetalLayer() const;
|
|
|
|
// Valid to call if the type is WindowsHWND
|
|
void* GetHInstance() const;
|
|
void* GetHWND() const;
|
|
|
|
// Valid to call if the type is WindowsXlib
|
|
void* GetXDisplay() const;
|
|
uint32_t GetXWindow() const;
|
|
|
|
private:
|
|
Ref<InstanceBase> mInstance;
|
|
Type mType;
|
|
|
|
// The swapchain will set this to null when it is destroyed.
|
|
NewSwapChainBase* mSwapChain = nullptr;
|
|
|
|
// MetalLayer
|
|
void* mMetalLayer = nullptr;
|
|
|
|
// WindowsHwnd
|
|
void* mHInstance = nullptr;
|
|
void* mHWND = nullptr;
|
|
|
|
// Xlib
|
|
void* mXDisplay = nullptr;
|
|
uint32_t mXWindow = 0;
|
|
};
|
|
|
|
} // namespace dawn_native
|
|
|
|
#endif // DAWNNATIVE_SURFACE_H_
|