1 #include "precompiled.h"
3 // Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
8 // Renderer.cpp: Implements EGL dependencies for creating and destroying Renderer instances.
10 #include <EGL/eglext.h>
11 #include "libGLESv2/main.h"
12 #include "libGLESv2/Program.h"
13 #include "libGLESv2/renderer/Renderer.h"
14 #include "common/utilities.h"
15 #include "third_party/trace_event/trace_event.h"
16 #include "libGLESv2/Shader.h"
18 #if defined (ANGLE_ENABLE_D3D9)
19 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
20 #endif // ANGLE_ENABLE_D3D9
22 #if defined (ANGLE_ENABLE_D3D11)
23 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
24 #endif // ANGLE_ENABLE_D3D11
26 #if !defined(ANGLE_DEFAULT_D3D11)
27 // Enables use of the Direct3D 11 API for a default display, when available
28 #define ANGLE_DEFAULT_D3D11 0
34 Renderer::Renderer(egl::Display *display)
36 mCapsInitialized(false),
37 mCurrentClientVersion(2)
43 gl::Shader::releaseCompiler();
46 const gl::Caps &Renderer::getRendererCaps() const
48 if (!mCapsInitialized)
50 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
51 mCapsInitialized = true;
57 const gl::TextureCapsMap &Renderer::getRendererTextureCaps() const
59 if (!mCapsInitialized)
61 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
62 mCapsInitialized = true;
68 const gl::Extensions &Renderer::getRendererExtensions() const
70 if (!mCapsInitialized)
72 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
73 mCapsInitialized = true;
79 typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
81 template <typename RendererType>
82 Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
84 return new RendererType(display, nativeDisplay, requestedDisplayType);
92 rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
94 std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
96 # if defined(ANGLE_ENABLE_D3D11)
97 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
98 nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
99 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
100 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
102 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
106 # if defined(ANGLE_ENABLE_D3D9)
107 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
108 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
110 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
114 if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
115 nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
116 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
118 // The default display is requested, try the D3D9 and D3D11 renderers, order them using
119 // the definition of ANGLE_DEFAULT_D3D11
120 # if ANGLE_DEFAULT_D3D11
121 # if defined(ANGLE_ENABLE_D3D11)
122 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
124 # if defined(ANGLE_ENABLE_D3D9)
125 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
128 # if defined(ANGLE_ENABLE_D3D9)
129 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
131 # if defined(ANGLE_ENABLE_D3D11)
132 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
137 for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
139 rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
140 if (renderer->initialize() == EGL_SUCCESS)
146 // Failed to create the renderer, try the next
147 SafeDelete(renderer);
154 void glDestroyRenderer(rx::Renderer *renderer)