Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / libGLESv2 / renderer / Renderer.cpp
1 #include "precompiled.h"
2 //
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.
6 //
7
8 // Renderer.cpp: Implements EGL dependencies for creating and destroying Renderer instances.
9
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"
17
18 #if defined (ANGLE_ENABLE_D3D9)
19 #include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
20 #endif // ANGLE_ENABLE_D3D9
21
22 #if defined (ANGLE_ENABLE_D3D11)
23 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
24 #endif // ANGLE_ENABLE_D3D11
25
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
29 #endif
30
31 namespace rx
32 {
33
34 Renderer::Renderer(egl::Display *display)
35     : mDisplay(display),
36       mCapsInitialized(false),
37       mCurrentClientVersion(2)
38 {
39 }
40
41 Renderer::~Renderer()
42 {
43     gl::Shader::releaseCompiler();
44 }
45
46 const gl::Caps &Renderer::getRendererCaps() const
47 {
48     if (!mCapsInitialized)
49     {
50         generateCaps(&mCaps, &mTextureCaps, &mExtensions);
51         mCapsInitialized = true;
52     }
53
54     return mCaps;
55 }
56
57 const gl::TextureCapsMap &Renderer::getRendererTextureCaps() const
58 {
59     if (!mCapsInitialized)
60     {
61         generateCaps(&mCaps, &mTextureCaps, &mExtensions);
62         mCapsInitialized = true;
63     }
64
65     return mTextureCaps;
66 }
67
68 const gl::Extensions &Renderer::getRendererExtensions() const
69 {
70     if (!mCapsInitialized)
71     {
72         generateCaps(&mCaps, &mTextureCaps, &mExtensions);
73         mCapsInitialized = true;
74     }
75
76     return mExtensions;
77 }
78
79 typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
80
81 template <typename RendererType>
82 Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
83 {
84     return new RendererType(display, nativeDisplay, requestedDisplayType);
85 }
86
87 }
88
89 extern "C"
90 {
91
92 rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
93 {
94     std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
95
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)
101         {
102             rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
103         }
104 #   endif
105
106 #   if defined(ANGLE_ENABLE_D3D9)
107         if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
108             requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
109         {
110             rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
111         }
112 #   endif
113
114     if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
115         nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
116         requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
117     {
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>);
123 #           endif
124 #           if defined(ANGLE_ENABLE_D3D9)
125                 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
126 #           endif
127 #       else
128 #           if defined(ANGLE_ENABLE_D3D9)
129                 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
130 #           endif
131 #           if defined(ANGLE_ENABLE_D3D11)
132                 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
133 #           endif
134 #       endif
135     }
136
137     for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
138     {
139         rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
140         if (renderer->initialize() == EGL_SUCCESS)
141         {
142             return renderer;
143         }
144         else
145         {
146             // Failed to create the renderer, try the next
147             SafeDelete(renderer);
148         }
149     }
150
151     return NULL;
152 }
153
154 void glDestroyRenderer(rx::Renderer *renderer)
155 {
156     delete renderer;
157 }
158
159 }