xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/DisplayD3D.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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.cpp: D3D implementation of egl::Display
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/DisplayD3D.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Config.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Surface.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Thread.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/histogram_macros.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/EGLImageD3D.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/RendererD3D.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/SurfaceD3D.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/SwapChainD3D.h"
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker #if !defined(ANGLE_DEFAULT_D3D11)
25*8975f5c5SAndroid Build Coastguard Worker // Enables use of the Direct3D 11 API for a default display, when available
26*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DEFAULT_D3D11 1
27*8975f5c5SAndroid Build Coastguard Worker #endif
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker namespace rx
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker using CreateRendererD3DFunction = RendererD3D *(*)(egl::Display *);
33*8975f5c5SAndroid Build Coastguard Worker 
CreateRendererD3D(egl::Display * display,RendererD3D ** outRenderer)34*8975f5c5SAndroid Build Coastguard Worker egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     ASSERT(outRenderer != nullptr);
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker     std::vector<CreateRendererD3DFunction> rendererCreationFunctions;
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     if (display->getPlatform() == EGL_PLATFORM_ANGLE_ANGLE)
41*8975f5c5SAndroid Build Coastguard Worker     {
42*8975f5c5SAndroid Build Coastguard Worker         const auto &attribMap              = display->getAttributeMap();
43*8975f5c5SAndroid Build Coastguard Worker         EGLNativeDisplayType nativeDisplay = display->getNativeDisplayId();
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker         EGLint requestedDisplayType = static_cast<EGLint>(
46*8975f5c5SAndroid Build Coastguard Worker             attribMap.get(EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE));
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D11)
49*8975f5c5SAndroid Build Coastguard Worker         const auto addD3D11 = nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
50*8975f5c5SAndroid Build Coastguard Worker                               nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
51*8975f5c5SAndroid Build Coastguard Worker                               requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE;
52*8975f5c5SAndroid Build Coastguard Worker #endif
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D9)
55*8975f5c5SAndroid Build Coastguard Worker         const auto addD3D9 = nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
56*8975f5c5SAndroid Build Coastguard Worker                              requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE;
57*8975f5c5SAndroid Build Coastguard Worker #endif
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_DEFAULT_D3D11
60*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D11)
61*8975f5c5SAndroid Build Coastguard Worker         if (addD3D11)
62*8975f5c5SAndroid Build Coastguard Worker         {
63*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer11);
64*8975f5c5SAndroid Build Coastguard Worker         }
65*8975f5c5SAndroid Build Coastguard Worker #    endif
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D9)
68*8975f5c5SAndroid Build Coastguard Worker         if (addD3D9)
69*8975f5c5SAndroid Build Coastguard Worker         {
70*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer9);
71*8975f5c5SAndroid Build Coastguard Worker         }
72*8975f5c5SAndroid Build Coastguard Worker #    endif
73*8975f5c5SAndroid Build Coastguard Worker #else
74*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D9)
75*8975f5c5SAndroid Build Coastguard Worker         if (addD3D9)
76*8975f5c5SAndroid Build Coastguard Worker         {
77*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer9);
78*8975f5c5SAndroid Build Coastguard Worker         }
79*8975f5c5SAndroid Build Coastguard Worker #    endif
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D11)
82*8975f5c5SAndroid Build Coastguard Worker         if (addD3D11)
83*8975f5c5SAndroid Build Coastguard Worker         {
84*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer11);
85*8975f5c5SAndroid Build Coastguard Worker         }
86*8975f5c5SAndroid Build Coastguard Worker #    endif
87*8975f5c5SAndroid Build Coastguard Worker #endif
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker         if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
90*8975f5c5SAndroid Build Coastguard Worker             nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
91*8975f5c5SAndroid Build Coastguard Worker             requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
92*8975f5c5SAndroid Build Coastguard Worker         {
93*8975f5c5SAndroid Build Coastguard Worker             // The default display is requested, try the D3D9 and D3D11 renderers, order them using
94*8975f5c5SAndroid Build Coastguard Worker             // the definition of ANGLE_DEFAULT_D3D11
95*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_DEFAULT_D3D11
96*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D11)
97*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer11);
98*8975f5c5SAndroid Build Coastguard Worker #    endif
99*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D9)
100*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer9);
101*8975f5c5SAndroid Build Coastguard Worker #    endif
102*8975f5c5SAndroid Build Coastguard Worker #else
103*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D9)
104*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer9);
105*8975f5c5SAndroid Build Coastguard Worker #    endif
106*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_D3D11)
107*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer11);
108*8975f5c5SAndroid Build Coastguard Worker #    endif
109*8975f5c5SAndroid Build Coastguard Worker #endif
110*8975f5c5SAndroid Build Coastguard Worker         }
111*8975f5c5SAndroid Build Coastguard Worker     }
112*8975f5c5SAndroid Build Coastguard Worker     else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT)
113*8975f5c5SAndroid Build Coastguard Worker     {
114*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D11)
115*8975f5c5SAndroid Build Coastguard Worker         if (display->getDevice()->getExtensions().deviceD3D11)
116*8975f5c5SAndroid Build Coastguard Worker         {
117*8975f5c5SAndroid Build Coastguard Worker             rendererCreationFunctions.push_back(CreateRenderer11);
118*8975f5c5SAndroid Build Coastguard Worker         }
119*8975f5c5SAndroid Build Coastguard Worker #endif
120*8975f5c5SAndroid Build Coastguard Worker     }
121*8975f5c5SAndroid Build Coastguard Worker     else
122*8975f5c5SAndroid Build Coastguard Worker     {
123*8975f5c5SAndroid Build Coastguard Worker         UNIMPLEMENTED();
124*8975f5c5SAndroid Build Coastguard Worker     }
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
127*8975f5c5SAndroid Build Coastguard Worker     {
128*8975f5c5SAndroid Build Coastguard Worker         RendererD3D *renderer = rendererCreationFunctions[i](display);
129*8975f5c5SAndroid Build Coastguard Worker         egl::Error result     = renderer->initialize();
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D11)
132*8975f5c5SAndroid Build Coastguard Worker         if (renderer->getRendererClass() == RENDERER_D3D11)
133*8975f5c5SAndroid Build Coastguard Worker         {
134*8975f5c5SAndroid Build Coastguard Worker             ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D11_INIT_ERRORS);
135*8975f5c5SAndroid Build Coastguard Worker             ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D11InitializeResult", result.getID(),
136*8975f5c5SAndroid Build Coastguard Worker                                         NUM_D3D11_INIT_ERRORS);
137*8975f5c5SAndroid Build Coastguard Worker         }
138*8975f5c5SAndroid Build Coastguard Worker #endif
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D9)
141*8975f5c5SAndroid Build Coastguard Worker         if (renderer->getRendererClass() == RENDERER_D3D9)
142*8975f5c5SAndroid Build Coastguard Worker         {
143*8975f5c5SAndroid Build Coastguard Worker             ASSERT(result.getID() >= 0 && result.getID() < NUM_D3D9_INIT_ERRORS);
144*8975f5c5SAndroid Build Coastguard Worker             ANGLE_HISTOGRAM_ENUMERATION("GPU.ANGLE.D3D9InitializeResult", result.getID(),
145*8975f5c5SAndroid Build Coastguard Worker                                         NUM_D3D9_INIT_ERRORS);
146*8975f5c5SAndroid Build Coastguard Worker         }
147*8975f5c5SAndroid Build Coastguard Worker #endif
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker         if (!result.isError())
150*8975f5c5SAndroid Build Coastguard Worker         {
151*8975f5c5SAndroid Build Coastguard Worker             *outRenderer = renderer;
152*8975f5c5SAndroid Build Coastguard Worker             return result;
153*8975f5c5SAndroid Build Coastguard Worker         }
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker         // Failed to create the renderer, try the next
156*8975f5c5SAndroid Build Coastguard Worker         SafeDelete(renderer);
157*8975f5c5SAndroid Build Coastguard Worker         ERR() << "Failed to create D3D renderer: " << result.getMessage();
158*8975f5c5SAndroid Build Coastguard Worker     }
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     return egl::EglNotInitialized() << "No available renderers.";
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
DisplayD3D(const egl::DisplayState & state)163*8975f5c5SAndroid Build Coastguard Worker DisplayD3D::DisplayD3D(const egl::DisplayState &state) : DisplayImpl(state), mRenderer(nullptr) {}
164*8975f5c5SAndroid Build Coastguard Worker 
createWindowSurface(const egl::SurfaceState & state,EGLNativeWindowType window,const egl::AttributeMap & attribs)165*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayD3D::createWindowSurface(const egl::SurfaceState &state,
166*8975f5c5SAndroid Build Coastguard Worker                                              EGLNativeWindowType window,
167*8975f5c5SAndroid Build Coastguard Worker                                              const egl::AttributeMap &attribs)
168*8975f5c5SAndroid Build Coastguard Worker {
169*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
170*8975f5c5SAndroid Build Coastguard Worker     return new WindowSurfaceD3D(state, mRenderer, mDisplay, window, attribs);
171*8975f5c5SAndroid Build Coastguard Worker }
172*8975f5c5SAndroid Build Coastguard Worker 
createPbufferSurface(const egl::SurfaceState & state,const egl::AttributeMap & attribs)173*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayD3D::createPbufferSurface(const egl::SurfaceState &state,
174*8975f5c5SAndroid Build Coastguard Worker                                               const egl::AttributeMap &attribs)
175*8975f5c5SAndroid Build Coastguard Worker {
176*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
177*8975f5c5SAndroid Build Coastguard Worker     return new PbufferSurfaceD3D(state, mRenderer, mDisplay, 0, nullptr, attribs);
178*8975f5c5SAndroid Build Coastguard Worker }
179*8975f5c5SAndroid Build Coastguard Worker 
createPbufferFromClientBuffer(const egl::SurfaceState & state,EGLenum buftype,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs)180*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayD3D::createPbufferFromClientBuffer(const egl::SurfaceState &state,
181*8975f5c5SAndroid Build Coastguard Worker                                                        EGLenum buftype,
182*8975f5c5SAndroid Build Coastguard Worker                                                        EGLClientBuffer clientBuffer,
183*8975f5c5SAndroid Build Coastguard Worker                                                        const egl::AttributeMap &attribs)
184*8975f5c5SAndroid Build Coastguard Worker {
185*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
186*8975f5c5SAndroid Build Coastguard Worker     return new PbufferSurfaceD3D(state, mRenderer, mDisplay, buftype, clientBuffer, attribs);
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker 
createPixmapSurface(const egl::SurfaceState & state,NativePixmapType nativePixmap,const egl::AttributeMap & attribs)189*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::SurfaceState &state,
190*8975f5c5SAndroid Build Coastguard Worker                                              NativePixmapType nativePixmap,
191*8975f5c5SAndroid Build Coastguard Worker                                              const egl::AttributeMap &attribs)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
194*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
195*8975f5c5SAndroid Build Coastguard Worker }
196*8975f5c5SAndroid Build Coastguard Worker 
createImage(const egl::ImageState & state,const gl::Context * context,EGLenum target,const egl::AttributeMap & attribs)197*8975f5c5SAndroid Build Coastguard Worker ImageImpl *DisplayD3D::createImage(const egl::ImageState &state,
198*8975f5c5SAndroid Build Coastguard Worker                                    const gl::Context *context,
199*8975f5c5SAndroid Build Coastguard Worker                                    EGLenum target,
200*8975f5c5SAndroid Build Coastguard Worker                                    const egl::AttributeMap &attribs)
201*8975f5c5SAndroid Build Coastguard Worker {
202*8975f5c5SAndroid Build Coastguard Worker     return new EGLImageD3D(state, target, attribs, mRenderer);
203*8975f5c5SAndroid Build Coastguard Worker }
204*8975f5c5SAndroid Build Coastguard Worker 
createDevice()205*8975f5c5SAndroid Build Coastguard Worker DeviceImpl *DisplayD3D::createDevice()
206*8975f5c5SAndroid Build Coastguard Worker {
207*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->createEGLDevice();
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker 
createContext(const gl::State & state,gl::ErrorSet * errorSet,const egl::Config * configuration,const gl::Context * shareContext,const egl::AttributeMap & attribs)210*8975f5c5SAndroid Build Coastguard Worker rx::ContextImpl *DisplayD3D::createContext(const gl::State &state,
211*8975f5c5SAndroid Build Coastguard Worker                                            gl::ErrorSet *errorSet,
212*8975f5c5SAndroid Build Coastguard Worker                                            const egl::Config *configuration,
213*8975f5c5SAndroid Build Coastguard Worker                                            const gl::Context *shareContext,
214*8975f5c5SAndroid Build Coastguard Worker                                            const egl::AttributeMap &attribs)
215*8975f5c5SAndroid Build Coastguard Worker {
216*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
217*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->createContext(state, errorSet);
218*8975f5c5SAndroid Build Coastguard Worker }
219*8975f5c5SAndroid Build Coastguard Worker 
createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,const egl::AttributeMap & attribs)220*8975f5c5SAndroid Build Coastguard Worker StreamProducerImpl *DisplayD3D::createStreamProducerD3DTexture(
221*8975f5c5SAndroid Build Coastguard Worker     egl::Stream::ConsumerType consumerType,
222*8975f5c5SAndroid Build Coastguard Worker     const egl::AttributeMap &attribs)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
225*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->createStreamProducerD3DTexture(consumerType, attribs);
226*8975f5c5SAndroid Build Coastguard Worker }
227*8975f5c5SAndroid Build Coastguard Worker 
createExternalImageSibling(const gl::Context * context,EGLenum target,EGLClientBuffer buffer,const egl::AttributeMap & attribs)228*8975f5c5SAndroid Build Coastguard Worker ExternalImageSiblingImpl *DisplayD3D::createExternalImageSibling(const gl::Context *context,
229*8975f5c5SAndroid Build Coastguard Worker                                                                  EGLenum target,
230*8975f5c5SAndroid Build Coastguard Worker                                                                  EGLClientBuffer buffer,
231*8975f5c5SAndroid Build Coastguard Worker                                                                  const egl::AttributeMap &attribs)
232*8975f5c5SAndroid Build Coastguard Worker {
233*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
234*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->createExternalImageSibling(context, target, buffer, attribs);
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
createShareGroup(const egl::ShareGroupState & state)237*8975f5c5SAndroid Build Coastguard Worker ShareGroupImpl *DisplayD3D::createShareGroup(const egl::ShareGroupState &state)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     return new ShareGroupD3D(state);
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker 
makeCurrent(egl::Display * display,egl::Surface * drawSurface,egl::Surface * readSurface,gl::Context * context)242*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::makeCurrent(egl::Display *display,
243*8975f5c5SAndroid Build Coastguard Worker                                    egl::Surface *drawSurface,
244*8975f5c5SAndroid Build Coastguard Worker                                    egl::Surface *readSurface,
245*8975f5c5SAndroid Build Coastguard Worker                                    gl::Context *context)
246*8975f5c5SAndroid Build Coastguard Worker {
247*8975f5c5SAndroid Build Coastguard Worker     // Ensure the appropriate global DebugAnnotator is used
248*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
249*8975f5c5SAndroid Build Coastguard Worker     mRenderer->setGlobalDebugAnnotator();
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
252*8975f5c5SAndroid Build Coastguard Worker }
253*8975f5c5SAndroid Build Coastguard Worker 
initialize(egl::Display * display)254*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::initialize(egl::Display *display)
255*8975f5c5SAndroid Build Coastguard Worker {
256*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer == nullptr && display != nullptr);
257*8975f5c5SAndroid Build Coastguard Worker     mDisplay = display;
258*8975f5c5SAndroid Build Coastguard Worker     ANGLE_TRY(CreateRendererD3D(display, &mRenderer));
259*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
260*8975f5c5SAndroid Build Coastguard Worker }
261*8975f5c5SAndroid Build Coastguard Worker 
terminate()262*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::terminate()
263*8975f5c5SAndroid Build Coastguard Worker {
264*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mRenderer);
265*8975f5c5SAndroid Build Coastguard Worker }
266*8975f5c5SAndroid Build Coastguard Worker 
generateConfigs()267*8975f5c5SAndroid Build Coastguard Worker egl::ConfigSet DisplayD3D::generateConfigs()
268*8975f5c5SAndroid Build Coastguard Worker {
269*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
270*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->generateConfigs();
271*8975f5c5SAndroid Build Coastguard Worker }
272*8975f5c5SAndroid Build Coastguard Worker 
testDeviceLost()273*8975f5c5SAndroid Build Coastguard Worker bool DisplayD3D::testDeviceLost()
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
276*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->testDeviceLost();
277*8975f5c5SAndroid Build Coastguard Worker }
278*8975f5c5SAndroid Build Coastguard Worker 
restoreLostDevice(const egl::Display * display)279*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::restoreLostDevice(const egl::Display *display)
280*8975f5c5SAndroid Build Coastguard Worker {
281*8975f5c5SAndroid Build Coastguard Worker     // Release surface resources to make the Reset() succeed
282*8975f5c5SAndroid Build Coastguard Worker     for (auto surface : mState.surfaceMap)
283*8975f5c5SAndroid Build Coastguard Worker     {
284*8975f5c5SAndroid Build Coastguard Worker         ASSERT(!surface.second->getBoundTexture());
285*8975f5c5SAndroid Build Coastguard Worker         SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface.second);
286*8975f5c5SAndroid Build Coastguard Worker         surfaceD3D->releaseSwapChain();
287*8975f5c5SAndroid Build Coastguard Worker     }
288*8975f5c5SAndroid Build Coastguard Worker 
289*8975f5c5SAndroid Build Coastguard Worker     if (!mRenderer->resetDevice())
290*8975f5c5SAndroid Build Coastguard Worker     {
291*8975f5c5SAndroid Build Coastguard Worker         return egl::EglBadAlloc();
292*8975f5c5SAndroid Build Coastguard Worker     }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     // Restore any surfaces that may have been lost
295*8975f5c5SAndroid Build Coastguard Worker     for (auto surface : mState.surfaceMap)
296*8975f5c5SAndroid Build Coastguard Worker     {
297*8975f5c5SAndroid Build Coastguard Worker         SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface.second);
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(surfaceD3D->resetSwapChain(display));
300*8975f5c5SAndroid Build Coastguard Worker     }
301*8975f5c5SAndroid Build Coastguard Worker 
302*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
303*8975f5c5SAndroid Build Coastguard Worker }
304*8975f5c5SAndroid Build Coastguard Worker 
isValidNativeWindow(EGLNativeWindowType window) const305*8975f5c5SAndroid Build Coastguard Worker bool DisplayD3D::isValidNativeWindow(EGLNativeWindowType window) const
306*8975f5c5SAndroid Build Coastguard Worker {
307*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->isValidNativeWindow(window);
308*8975f5c5SAndroid Build Coastguard Worker }
309*8975f5c5SAndroid Build Coastguard Worker 
validateClientBuffer(const egl::Config * config,EGLenum buftype,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs) const310*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::validateClientBuffer(const egl::Config *config,
311*8975f5c5SAndroid Build Coastguard Worker                                             EGLenum buftype,
312*8975f5c5SAndroid Build Coastguard Worker                                             EGLClientBuffer clientBuffer,
313*8975f5c5SAndroid Build Coastguard Worker                                             const egl::AttributeMap &attribs) const
314*8975f5c5SAndroid Build Coastguard Worker {
315*8975f5c5SAndroid Build Coastguard Worker     switch (buftype)
316*8975f5c5SAndroid Build Coastguard Worker     {
317*8975f5c5SAndroid Build Coastguard Worker         case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
318*8975f5c5SAndroid Build Coastguard Worker             return mRenderer->validateShareHandle(config, static_cast<HANDLE>(clientBuffer),
319*8975f5c5SAndroid Build Coastguard Worker                                                   attribs);
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker         case EGL_D3D_TEXTURE_ANGLE:
322*8975f5c5SAndroid Build Coastguard Worker             return mRenderer->getD3DTextureInfo(config, static_cast<IUnknown *>(clientBuffer),
323*8975f5c5SAndroid Build Coastguard Worker                                                 attribs, nullptr, nullptr, nullptr, nullptr,
324*8975f5c5SAndroid Build Coastguard Worker                                                 nullptr, nullptr);
325*8975f5c5SAndroid Build Coastguard Worker 
326*8975f5c5SAndroid Build Coastguard Worker         default:
327*8975f5c5SAndroid Build Coastguard Worker             return DisplayImpl::validateClientBuffer(config, buftype, clientBuffer, attribs);
328*8975f5c5SAndroid Build Coastguard Worker     }
329*8975f5c5SAndroid Build Coastguard Worker }
330*8975f5c5SAndroid Build Coastguard Worker 
validateImageClientBuffer(const gl::Context * context,EGLenum target,EGLClientBuffer clientBuffer,const egl::AttributeMap & attribs) const331*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::validateImageClientBuffer(const gl::Context *context,
332*8975f5c5SAndroid Build Coastguard Worker                                                  EGLenum target,
333*8975f5c5SAndroid Build Coastguard Worker                                                  EGLClientBuffer clientBuffer,
334*8975f5c5SAndroid Build Coastguard Worker                                                  const egl::AttributeMap &attribs) const
335*8975f5c5SAndroid Build Coastguard Worker {
336*8975f5c5SAndroid Build Coastguard Worker     switch (target)
337*8975f5c5SAndroid Build Coastguard Worker     {
338*8975f5c5SAndroid Build Coastguard Worker         case EGL_D3D11_TEXTURE_ANGLE:
339*8975f5c5SAndroid Build Coastguard Worker         {
340*8975f5c5SAndroid Build Coastguard Worker             return mRenderer->getD3DTextureInfo(nullptr, static_cast<IUnknown *>(clientBuffer),
341*8975f5c5SAndroid Build Coastguard Worker                                                 attribs, nullptr, nullptr, nullptr, nullptr,
342*8975f5c5SAndroid Build Coastguard Worker                                                 nullptr, nullptr);
343*8975f5c5SAndroid Build Coastguard Worker         }
344*8975f5c5SAndroid Build Coastguard Worker 
345*8975f5c5SAndroid Build Coastguard Worker         default:
346*8975f5c5SAndroid Build Coastguard Worker             return DisplayImpl::validateImageClientBuffer(context, target, clientBuffer, attribs);
347*8975f5c5SAndroid Build Coastguard Worker     }
348*8975f5c5SAndroid Build Coastguard Worker }
349*8975f5c5SAndroid Build Coastguard Worker 
generateExtensions(egl::DisplayExtensions * outExtensions) const350*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::generateExtensions(egl::DisplayExtensions *outExtensions) const
351*8975f5c5SAndroid Build Coastguard Worker {
352*8975f5c5SAndroid Build Coastguard Worker     mRenderer->generateDisplayExtensions(outExtensions);
353*8975f5c5SAndroid Build Coastguard Worker }
354*8975f5c5SAndroid Build Coastguard Worker 
getRendererDescription()355*8975f5c5SAndroid Build Coastguard Worker std::string DisplayD3D::getRendererDescription()
356*8975f5c5SAndroid Build Coastguard Worker {
357*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
358*8975f5c5SAndroid Build Coastguard Worker     {
359*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getRendererDescription();
360*8975f5c5SAndroid Build Coastguard Worker     }
361*8975f5c5SAndroid Build Coastguard Worker     return std::string();
362*8975f5c5SAndroid Build Coastguard Worker }
363*8975f5c5SAndroid Build Coastguard Worker 
getVendorString()364*8975f5c5SAndroid Build Coastguard Worker std::string DisplayD3D::getVendorString()
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
367*8975f5c5SAndroid Build Coastguard Worker     {
368*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getVendorString();
369*8975f5c5SAndroid Build Coastguard Worker     }
370*8975f5c5SAndroid Build Coastguard Worker     return std::string();
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker 
getVersionString(bool includeFullVersion)373*8975f5c5SAndroid Build Coastguard Worker std::string DisplayD3D::getVersionString(bool includeFullVersion)
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker     if (mRenderer)
376*8975f5c5SAndroid Build Coastguard Worker     {
377*8975f5c5SAndroid Build Coastguard Worker         return mRenderer->getVersionString(includeFullVersion);
378*8975f5c5SAndroid Build Coastguard Worker     }
379*8975f5c5SAndroid Build Coastguard Worker     return std::string();
380*8975f5c5SAndroid Build Coastguard Worker }
381*8975f5c5SAndroid Build Coastguard Worker 
generateCaps(egl::Caps * outCaps) const382*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::generateCaps(egl::Caps *outCaps) const
383*8975f5c5SAndroid Build Coastguard Worker {
384*8975f5c5SAndroid Build Coastguard Worker     // Display must be initialized to generate caps
385*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderer != nullptr);
386*8975f5c5SAndroid Build Coastguard Worker 
387*8975f5c5SAndroid Build Coastguard Worker     outCaps->textureNPOT = mRenderer->getNativeExtensions().textureNpotOES;
388*8975f5c5SAndroid Build Coastguard Worker }
389*8975f5c5SAndroid Build Coastguard Worker 
waitClient(const gl::Context * context)390*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::waitClient(const gl::Context *context)
391*8975f5c5SAndroid Build Coastguard Worker {
392*8975f5c5SAndroid Build Coastguard Worker     for (auto surface : mState.surfaceMap)
393*8975f5c5SAndroid Build Coastguard Worker     {
394*8975f5c5SAndroid Build Coastguard Worker         SurfaceD3D *surfaceD3D = GetImplAs<SurfaceD3D>(surface.second);
395*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(surfaceD3D->checkForOutOfDateSwapChain(this));
396*8975f5c5SAndroid Build Coastguard Worker     }
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
399*8975f5c5SAndroid Build Coastguard Worker }
400*8975f5c5SAndroid Build Coastguard Worker 
waitNative(const gl::Context * context,EGLint engine)401*8975f5c5SAndroid Build Coastguard Worker egl::Error DisplayD3D::waitNative(const gl::Context *context, EGLint engine)
402*8975f5c5SAndroid Build Coastguard Worker {
403*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *drawSurface = context->getCurrentDrawSurface();
404*8975f5c5SAndroid Build Coastguard Worker     egl::Surface *readSurface = context->getCurrentReadSurface();
405*8975f5c5SAndroid Build Coastguard Worker 
406*8975f5c5SAndroid Build Coastguard Worker     if (drawSurface != nullptr)
407*8975f5c5SAndroid Build Coastguard Worker     {
408*8975f5c5SAndroid Build Coastguard Worker         SurfaceD3D *drawSurfaceD3D = GetImplAs<SurfaceD3D>(drawSurface);
409*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(drawSurfaceD3D->checkForOutOfDateSwapChain(this));
410*8975f5c5SAndroid Build Coastguard Worker     }
411*8975f5c5SAndroid Build Coastguard Worker 
412*8975f5c5SAndroid Build Coastguard Worker     if (readSurface != nullptr)
413*8975f5c5SAndroid Build Coastguard Worker     {
414*8975f5c5SAndroid Build Coastguard Worker         SurfaceD3D *readSurfaceD3D = GetImplAs<SurfaceD3D>(readSurface);
415*8975f5c5SAndroid Build Coastguard Worker         ANGLE_TRY(readSurfaceD3D->checkForOutOfDateSwapChain(this));
416*8975f5c5SAndroid Build Coastguard Worker     }
417*8975f5c5SAndroid Build Coastguard Worker 
418*8975f5c5SAndroid Build Coastguard Worker     return egl::NoError();
419*8975f5c5SAndroid Build Coastguard Worker }
420*8975f5c5SAndroid Build Coastguard Worker 
getMaxSupportedESVersion() const421*8975f5c5SAndroid Build Coastguard Worker gl::Version DisplayD3D::getMaxSupportedESVersion() const
422*8975f5c5SAndroid Build Coastguard Worker {
423*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMaxSupportedESVersion();
424*8975f5c5SAndroid Build Coastguard Worker }
425*8975f5c5SAndroid Build Coastguard Worker 
getMaxConformantESVersion() const426*8975f5c5SAndroid Build Coastguard Worker gl::Version DisplayD3D::getMaxConformantESVersion() const
427*8975f5c5SAndroid Build Coastguard Worker {
428*8975f5c5SAndroid Build Coastguard Worker     return mRenderer->getMaxConformantESVersion();
429*8975f5c5SAndroid Build Coastguard Worker }
430*8975f5c5SAndroid Build Coastguard Worker 
handleResult(HRESULT hr,const char * message,const char * file,const char * function,unsigned int line)431*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::handleResult(HRESULT hr,
432*8975f5c5SAndroid Build Coastguard Worker                               const char *message,
433*8975f5c5SAndroid Build Coastguard Worker                               const char *file,
434*8975f5c5SAndroid Build Coastguard Worker                               const char *function,
435*8975f5c5SAndroid Build Coastguard Worker                               unsigned int line)
436*8975f5c5SAndroid Build Coastguard Worker {
437*8975f5c5SAndroid Build Coastguard Worker     ASSERT(FAILED(hr));
438*8975f5c5SAndroid Build Coastguard Worker 
439*8975f5c5SAndroid Build Coastguard Worker     std::stringstream errorStream;
440*8975f5c5SAndroid Build Coastguard Worker     errorStream << "Internal D3D11 error: " << gl::FmtHR(hr) << ", in " << file << ", " << function
441*8975f5c5SAndroid Build Coastguard Worker                 << ":" << line << ". " << message;
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker     mStoredErrorString = errorStream.str();
444*8975f5c5SAndroid Build Coastguard Worker }
445*8975f5c5SAndroid Build Coastguard Worker 
initializeFrontendFeatures(angle::FrontendFeatures * features) const446*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::initializeFrontendFeatures(angle::FrontendFeatures *features) const
447*8975f5c5SAndroid Build Coastguard Worker {
448*8975f5c5SAndroid Build Coastguard Worker     mRenderer->initializeFrontendFeatures(features);
449*8975f5c5SAndroid Build Coastguard Worker }
450*8975f5c5SAndroid Build Coastguard Worker 
populateFeatureList(angle::FeatureList * features)451*8975f5c5SAndroid Build Coastguard Worker void DisplayD3D::populateFeatureList(angle::FeatureList *features)
452*8975f5c5SAndroid Build Coastguard Worker {
453*8975f5c5SAndroid Build Coastguard Worker     mRenderer->getFeatures().populateFeatureList(features);
454*8975f5c5SAndroid Build Coastguard Worker }
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
457