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