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