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