Corentin Wallez d26ee85fba Implement the webgpu.h swapchains in the frontend and Null backend.
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>
2020-01-25 10:05:40 +00:00

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_