2 // Copyright (c) 2012-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.
7 // Renderer.cpp: Implements EGL dependencies for creating and destroying Renderer instances.
9 #include "libGLESv2/main.h"
10 #include "libGLESv2/Program.h"
11 #include "libGLESv2/renderer/Renderer.h"
12 #include "common/utilities.h"
13 #include "third_party/trace_event/trace_event.h"
14 #include "libGLESv2/Shader.h"
16 #if defined (ANGLE_ENABLE_D3D9)
17 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
18 #endif // ANGLE_ENABLE_D3D9
20 #if defined (ANGLE_ENABLE_D3D11)
21 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
22 #endif // ANGLE_ENABLE_D3D11
24 #if defined (ANGLE_TEST_CONFIG)
25 #define ANGLE_DEFAULT_D3D11 1
28 #if !defined(ANGLE_DEFAULT_D3D11)
29 // Enables use of the Direct3D 11 API for a default display, when available
30 #define ANGLE_DEFAULT_D3D11 0
33 #include <EGL/eglext.h>
38 Renderer::Renderer(egl::Display *display)
40 mCapsInitialized(false),
41 mWorkaroundsInitialized(false),
42 mCurrentClientVersion(2)
50 const gl::Caps &Renderer::getRendererCaps() const
52 if (!mCapsInitialized)
54 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
55 mCapsInitialized = true;
61 const gl::TextureCapsMap &Renderer::getRendererTextureCaps() const
63 if (!mCapsInitialized)
65 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
66 mCapsInitialized = true;
72 const gl::Extensions &Renderer::getRendererExtensions() const
74 if (!mCapsInitialized)
76 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
77 mCapsInitialized = true;
83 const Workarounds &Renderer::getWorkarounds() const
85 if (!mWorkaroundsInitialized)
87 mWorkarounds = generateWorkarounds();
88 mWorkaroundsInitialized = true;
94 typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
96 template <typename RendererType>
97 Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
99 return new RendererType(display, nativeDisplay, requestedDisplayType);
107 rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
109 std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
111 # if defined(ANGLE_ENABLE_D3D11)
112 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
113 nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
114 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
115 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
117 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
121 # if defined(ANGLE_ENABLE_D3D9)
122 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
123 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
125 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
129 if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
130 nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
131 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
133 // The default display is requested, try the D3D9 and D3D11 renderers, order them using
134 // the definition of ANGLE_DEFAULT_D3D11
135 # if ANGLE_DEFAULT_D3D11
136 # if defined(ANGLE_ENABLE_D3D11)
137 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
139 # if defined(ANGLE_ENABLE_D3D9)
140 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
143 # if defined(ANGLE_ENABLE_D3D9)
144 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
146 # if defined(ANGLE_ENABLE_D3D11)
147 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
152 for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
154 rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
155 if (renderer->initialize() == EGL_SUCCESS)
161 // Failed to create the renderer, try the next
162 SafeDelete(renderer);
169 void glDestroyRenderer(rx::Renderer *renderer)