blob: 0cab1995f769ebadb2d2380d5149ddd1ad71353e [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +00002//
Geoff Langcec35902014-04-16 10:52:36 -04003// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +00004// 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
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000010#include <EGL/eglext.h>
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000011#include "libGLESv2/main.h"
12#include "libGLESv2/Program.h"
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000013#include "libGLESv2/renderer/Renderer.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000014#include "common/utilities.h"
Al Patrick3c6344e2013-09-23 14:57:00 -040015#include "third_party/trace_event/trace_event.h"
Jamie Madillbde4c2f2014-03-21 10:42:10 -040016#include "libGLESv2/Shader.h"
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000017
Geoff Lang2a419242014-02-10 13:00:44 -050018#if defined (ANGLE_ENABLE_D3D9)
Brandon Jonesc7a41042014-06-23 12:03:25 -070019#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
Geoff Lang2a419242014-02-10 13:00:44 -050020#endif // ANGLE_ENABLE_D3D9
21
22#if defined (ANGLE_ENABLE_D3D11)
Brandon Jonesc7a41042014-06-23 12:03:25 -070023#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
Geoff Lang2a419242014-02-10 13:00:44 -050024#endif // ANGLE_ENABLE_D3D11
25
26#if !defined(ANGLE_DEFAULT_D3D11)
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000027// Enables use of the Direct3D 11 API for a default display, when available
Jamie Madillf81e69b2014-03-26 14:05:48 -040028#define ANGLE_DEFAULT_D3D11 0
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000029#endif
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000030
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000031namespace rx
32{
33
Geoff Langcec35902014-04-16 10:52:36 -040034Renderer::Renderer(egl::Display *display)
35 : mDisplay(display),
36 mCapsInitialized(false),
37 mCurrentClientVersion(2)
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000038{
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000039}
40
Jamie Madillbde4c2f2014-03-21 10:42:10 -040041Renderer::~Renderer()
42{
43 gl::Shader::releaseCompiler();
44}
45
Geoff Langc0b9ef42014-07-02 10:02:37 -040046const gl::Caps &Renderer::getRendererCaps() const
Geoff Langcec35902014-04-16 10:52:36 -040047{
48 if (!mCapsInitialized)
49 {
Geoff Langc0b9ef42014-07-02 10:02:37 -040050 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
Geoff Langcec35902014-04-16 10:52:36 -040051 mCapsInitialized = true;
52 }
53
54 return mCaps;
55}
56
Geoff Langc0b9ef42014-07-02 10:02:37 -040057const 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
68const 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
Geoff Lang591e6af2014-06-18 18:08:57 -040079typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
80
81template <typename RendererType>
82Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
83{
84 return new RendererType(display, nativeDisplay, requestedDisplayType);
85}
86
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000087}
88
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000089extern "C"
90{
91
Geoff Lang591e6af2014-06-18 18:08:57 -040092rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000093{
Geoff Lang591e6af2014-06-18 18:08:57 -040094 std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000095
Geoff Lang591e6af2014-06-18 18:08:57 -040096# 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)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000117 {
Geoff Lang591e6af2014-06-18 18:08:57 -0400118 // The default display is requested, try the D3D9 and D3D11 renderers, order them using
119 // the definition of ANGLE_DEFAULT_D3D11
Shannon Woods10f05632014-08-25 19:36:20 -0400120# if defined(ANGLE_DEFAULT_D3D11)
Geoff Lang591e6af2014-06-18 18:08:57 -0400121# 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);
Geoff Lang2a419242014-02-10 13:00:44 -0500140 if (renderer->initialize() == EGL_SUCCESS)
141 {
142 return renderer;
143 }
144 else
145 {
Geoff Lang591e6af2014-06-18 18:08:57 -0400146 // Failed to create the renderer, try the next
Geoff Lang2a419242014-02-10 13:00:44 -0500147 SafeDelete(renderer);
148 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000149 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000150
151 return NULL;
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +0000152}
153
154void glDestroyRenderer(rx::Renderer *renderer)
155{
156 delete renderer;
157}
158
Geoff Lang2a419242014-02-10 13:00:44 -0500159}