Hash :
31c0f439
Author :
Date :
2024-08-02T09:18:33
WebGPU: Centralize caps generation All GL and EGL caps can be generated at display creation time for WebGPU. Move all existing logic into a centralized GenerateCaps function. Bug: angleproject:357017322 Change-Id: I7398d4ee539192d64971023d9a598ac1f11592ad Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5759279 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Liza Burakova <liza@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
//
// Copyright 2024 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DisplayWgpu.h:
// Defines the class interface for DisplayWgpu, implementing DisplayImpl.
//
#ifndef LIBANGLE_RENDERER_WGPU_DISPLAYWGPU_H_
#define LIBANGLE_RENDERER_WGPU_DISPLAYWGPU_H_
#include <dawn/native/DawnNative.h>
#include <dawn/webgpu_cpp.h>
#include "libANGLE/renderer/DisplayImpl.h"
#include "libANGLE/renderer/ShareGroupImpl.h"
#include "libANGLE/renderer/wgpu/wgpu_format_utils.h"
namespace rx
{
class ShareGroupWgpu : public ShareGroupImpl
{
public:
ShareGroupWgpu(const egl::ShareGroupState &state) : ShareGroupImpl(state) {}
};
class AllocationTrackerWgpu;
class DisplayWgpu : public DisplayImpl
{
public:
DisplayWgpu(const egl::DisplayState &state);
~DisplayWgpu() override;
egl::Error initialize(egl::Display *display) override;
void terminate() override;
egl::Error makeCurrent(egl::Display *display,
egl::Surface *drawSurface,
egl::Surface *readSurface,
gl::Context *context) override;
egl::ConfigSet generateConfigs() override;
bool testDeviceLost() override;
egl::Error restoreLostDevice(const egl::Display *display) override;
bool isValidNativeWindow(EGLNativeWindowType window) const override;
std::string getRendererDescription() override;
std::string getVendorString() override;
std::string getVersionString(bool includeFullVersion) override;
DeviceImpl *createDevice() override;
egl::Error waitClient(const gl::Context *context) override;
egl::Error waitNative(const gl::Context *context, EGLint engine) override;
gl::Version getMaxSupportedESVersion() const override;
gl::Version getMaxConformantESVersion() const override;
Optional<gl::Version> getMaxSupportedDesktopVersion() const override;
SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
EGLNativeWindowType window,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
EGLenum buftype,
EGLClientBuffer buffer,
const egl::AttributeMap &attribs) override;
SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;
ImageImpl *createImage(const egl::ImageState &state,
const gl::Context *context,
EGLenum target,
const egl::AttributeMap &attribs) override;
ContextImpl *createContext(const gl::State &state,
gl::ErrorSet *errorSet,
const egl::Config *configuration,
const gl::Context *shareContext,
const egl::AttributeMap &attribs) override;
StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,
const egl::AttributeMap &attribs) override;
ShareGroupImpl *createShareGroup(const egl::ShareGroupState &state) override;
void populateFeatureList(angle::FeatureList *features) override {}
angle::NativeWindowSystem getWindowSystem() const override;
wgpu::Adapter &getAdapter() { return mAdapter; }
wgpu::Device &getDevice() { return mDevice; }
wgpu::Queue &getQueue() { return mQueue; }
wgpu::Instance &getInstance() { return mInstance; }
const gl::Caps &getGLCaps() const { return mGLCaps; }
const gl::TextureCapsMap &getGLTextureCaps() const { return mGLTextureCaps; }
const gl::Extensions &getGLExtensions() const { return mGLExtensions; }
const gl::Limitations &getGLLimitations() const { return mGLLimitations; }
const ShPixelLocalStorageOptions &getPLSOptions() const { return mPLSOptions; }
std::map<EGLNativeWindowType, wgpu::Surface> &getSurfaceCache() { return mSurfaceCache; }
const webgpu::Format &getFormat(GLenum internalFormat) const
{
return mFormatTable[internalFormat];
}
private:
void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
void generateCaps(egl::Caps *outCaps) const override;
egl::Error createWgpuDevice();
wgpu::Adapter mAdapter;
wgpu::Instance mInstance;
wgpu::Device mDevice;
wgpu::Queue mQueue;
gl::Caps mGLCaps;
gl::TextureCapsMap mGLTextureCaps;
gl::Extensions mGLExtensions;
gl::Limitations mGLLimitations;
egl::Caps mEGLCaps;
egl::DisplayExtensions mEGLExtensions;
gl::Version mMaxSupportedClientVersion;
ShPixelLocalStorageOptions mPLSOptions;
// http://anglebug.com/342213844
// Dawn currently holds references to the internal swap chains for an unknown amount of time
// after destroying a surface and can fail to create a new swap chain for the same window.
// ANGLE tests re-create EGL surfaces for the same window each test. As a workaround, cache the
// wgpu::Surface created for each window for the lifetime of the display.
std::map<EGLNativeWindowType, wgpu::Surface> mSurfaceCache;
webgpu::FormatTable mFormatTable;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_WGPU_DISPLAYWGPU_H_