xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/DisplayD3D.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // DisplayD3D.h: D3D implementation of egl::Display
8 
9 #ifndef LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
10 #define LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
11 
12 #include "libANGLE/Device.h"
13 #include "libANGLE/renderer/DisplayImpl.h"
14 #include "libANGLE/renderer/ShareGroupImpl.h"
15 
16 #include "libANGLE/renderer/d3d/RendererD3D.h"
17 
18 namespace rx
19 {
20 class ShareGroupD3D : public ShareGroupImpl
21 {
22   public:
ShareGroupD3D(const egl::ShareGroupState & state)23     ShareGroupD3D(const egl::ShareGroupState &state) : ShareGroupImpl(state) {}
24 };
25 
26 class DisplayD3D : public DisplayImpl, public d3d::Context
27 {
28   public:
29     DisplayD3D(const egl::DisplayState &state);
30 
31     egl::Error initialize(egl::Display *display) override;
32     void terminate() override;
33 
34     // Surface creation
35     SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
36                                      EGLNativeWindowType window,
37                                      const egl::AttributeMap &attribs) override;
38     SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
39                                       const egl::AttributeMap &attribs) override;
40     SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
41                                                EGLenum buftype,
42                                                EGLClientBuffer clientBuffer,
43                                                const egl::AttributeMap &attribs) override;
44     SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
45                                      NativePixmapType nativePixmap,
46                                      const egl::AttributeMap &attribs) override;
47 
48     ImageImpl *createImage(const egl::ImageState &state,
49                            const gl::Context *context,
50                            EGLenum target,
51                            const egl::AttributeMap &attribs) override;
52 
53     ContextImpl *createContext(const gl::State &state,
54                                gl::ErrorSet *errorSet,
55                                const egl::Config *configuration,
56                                const gl::Context *shareContext,
57                                const egl::AttributeMap &attribs) override;
58 
59     StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,
60                                                        const egl::AttributeMap &attribs) override;
61 
62     ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context,
63                                                          EGLenum target,
64                                                          EGLClientBuffer buffer,
65                                                          const egl::AttributeMap &attribs) override;
66 
67     ShareGroupImpl *createShareGroup(const egl::ShareGroupState &state) override;
68 
69     egl::Error makeCurrent(egl::Display *display,
70                            egl::Surface *drawSurface,
71                            egl::Surface *readSurface,
72                            gl::Context *context) override;
73 
74     egl::ConfigSet generateConfigs() override;
75 
76     bool testDeviceLost() override;
77     egl::Error restoreLostDevice(const egl::Display *display) override;
78 
79     bool isValidNativeWindow(EGLNativeWindowType window) const override;
80     egl::Error validateClientBuffer(const egl::Config *configuration,
81                                     EGLenum buftype,
82                                     EGLClientBuffer clientBuffer,
83                                     const egl::AttributeMap &attribs) const override;
84     egl::Error validateImageClientBuffer(const gl::Context *context,
85                                          EGLenum target,
86                                          EGLClientBuffer clientBuffer,
87                                          const egl::AttributeMap &attribs) const override;
88 
89     DeviceImpl *createDevice() override;
90 
91     std::string getRendererDescription() override;
92     std::string getVendorString() override;
93     std::string getVersionString(bool includeFullVersion) override;
94 
95     egl::Error waitClient(const gl::Context *context) override;
96     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
97     gl::Version getMaxSupportedESVersion() const override;
98     gl::Version getMaxConformantESVersion() const override;
99 
100     void handleResult(HRESULT hr,
101                       const char *message,
102                       const char *file,
103                       const char *function,
104                       unsigned int line) override;
105 
getStoredErrorString()106     const std::string &getStoredErrorString() const { return mStoredErrorString; }
107 
108     void initializeFrontendFeatures(angle::FrontendFeatures *features) const override;
109 
110     void populateFeatureList(angle::FeatureList *features) override;
111 
112   private:
113     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
114     void generateCaps(egl::Caps *outCaps) const override;
115 
116     egl::Display *mDisplay;
117 
118     rx::RendererD3D *mRenderer;
119     std::string mStoredErrorString;
120 };
121 
122 // Possible reasons RendererD3D initialize can fail
123 enum D3D11InitError
124 {
125     // The renderer loaded successfully
126     D3D11_INIT_SUCCESS = 0,
127     // Failed to load the ANGLE & D3D compiler libraries
128     D3D11_INIT_COMPILER_ERROR,
129     // Failed to load a necessary DLL (non-compiler)
130     D3D11_INIT_MISSING_DEP,
131     // CreateDevice returned E_INVALIDARG
132     D3D11_INIT_CREATEDEVICE_INVALIDARG,
133     // CreateDevice failed with an error other than invalid arg
134     D3D11_INIT_CREATEDEVICE_ERROR,
135     // DXGI 1.2 required but not found
136     D3D11_INIT_INCOMPATIBLE_DXGI,
137     // Other initialization error
138     D3D11_INIT_OTHER_ERROR,
139     // CreateDevice returned E_FAIL
140     D3D11_INIT_CREATEDEVICE_FAIL,
141     // CreateDevice returned E_NOTIMPL
142     D3D11_INIT_CREATEDEVICE_NOTIMPL,
143     // CreateDevice returned E_OUTOFMEMORY
144     D3D11_INIT_CREATEDEVICE_OUTOFMEMORY,
145     // CreateDevice returned DXGI_ERROR_INVALID_CALL
146     D3D11_INIT_CREATEDEVICE_INVALIDCALL,
147     // CreateDevice returned DXGI_ERROR_SDK_COMPONENT_MISSING
148     D3D11_INIT_CREATEDEVICE_COMPONENTMISSING,
149     // CreateDevice returned DXGI_ERROR_WAS_STILL_DRAWING
150     D3D11_INIT_CREATEDEVICE_WASSTILLDRAWING,
151     // CreateDevice returned DXGI_ERROR_NOT_CURRENTLY_AVAILABLE
152     D3D11_INIT_CREATEDEVICE_NOTAVAILABLE,
153     // CreateDevice returned DXGI_ERROR_DEVICE_HUNG
154     D3D11_INIT_CREATEDEVICE_DEVICEHUNG,
155     // CreateDevice returned NULL
156     D3D11_INIT_CREATEDEVICE_NULL,
157     NUM_D3D11_INIT_ERRORS
158 };
159 
160 enum D3D9InitError
161 {
162     D3D9_INIT_SUCCESS = 0,
163     // Failed to load the D3D or ANGLE compiler
164     D3D9_INIT_COMPILER_ERROR,
165     // Failed to load a necessary DLL
166     D3D9_INIT_MISSING_DEP,
167     // Device creation error
168     D3D9_INIT_CREATE_DEVICE_ERROR,
169     // System does not meet minimum shader spec
170     D3D9_INIT_UNSUPPORTED_VERSION,
171     // System does not support stretchrect from textures
172     D3D9_INIT_UNSUPPORTED_STRETCHRECT,
173     // A call returned out of memory or device lost
174     D3D9_INIT_OUT_OF_MEMORY,
175     // Other unspecified error
176     D3D9_INIT_OTHER_ERROR,
177     NUM_D3D9_INIT_ERRORS
178 };
179 
180 }  // namespace rx
181 
182 #endif  // LIBANGLE_RENDERER_D3D_DISPLAYD3D_H_
183