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