blob: 5a61d422a4c98d8767071c0ca61c02123fdacaf2 [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{
Jamie Madillbde4c2f2014-03-21 10:42:10 -040043}
44
Geoff Langc0b9ef42014-07-02 10:02:37 -040045const gl::Caps &Renderer::getRendererCaps() const
Geoff Langcec35902014-04-16 10:52:36 -040046{
47 if (!mCapsInitialized)
48 {
Geoff Langc0b9ef42014-07-02 10:02:37 -040049 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
Geoff Langcec35902014-04-16 10:52:36 -040050 mCapsInitialized = true;
51 }
52
53 return mCaps;
54}
55
Geoff Langc0b9ef42014-07-02 10:02:37 -040056const gl::TextureCapsMap &Renderer::getRendererTextureCaps() const
57{
58 if (!mCapsInitialized)
59 {
60 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
61 mCapsInitialized = true;
62 }
63
64 return mTextureCaps;
65}
66
67const gl::Extensions &Renderer::getRendererExtensions() const
68{
69 if (!mCapsInitialized)
70 {
71 generateCaps(&mCaps, &mTextureCaps, &mExtensions);
72 mCapsInitialized = true;
73 }
74
75 return mExtensions;
76}
77
Geoff Lang591e6af2014-06-18 18:08:57 -040078typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
79
80template <typename RendererType>
81Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
82{
83 return new RendererType(display, nativeDisplay, requestedDisplayType);
84}
85
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000086}
87
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000088extern "C"
89{
90
Geoff Lang591e6af2014-06-18 18:08:57 -040091rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000092{
Geoff Lang591e6af2014-06-18 18:08:57 -040093 std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000094
Geoff Lang591e6af2014-06-18 18:08:57 -040095# if defined(ANGLE_ENABLE_D3D11)
96 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
97 nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
98 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
99 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
100 {
101 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
102 }
103# endif
104
105# if defined(ANGLE_ENABLE_D3D9)
106 if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
107 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
108 {
109 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
110 }
111# endif
112
113 if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
114 nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
115 requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000116 {
Geoff Lang591e6af2014-06-18 18:08:57 -0400117 // The default display is requested, try the D3D9 and D3D11 renderers, order them using
118 // the definition of ANGLE_DEFAULT_D3D11
Shannon Woods10f05632014-08-25 19:36:20 -0400119# if defined(ANGLE_DEFAULT_D3D11)
Geoff Lang591e6af2014-06-18 18:08:57 -0400120# if defined(ANGLE_ENABLE_D3D11)
121 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
122# endif
123# if defined(ANGLE_ENABLE_D3D9)
124 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
125# endif
126# else
127# if defined(ANGLE_ENABLE_D3D9)
128 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
129# endif
130# if defined(ANGLE_ENABLE_D3D11)
131 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
132# endif
133# endif
134 }
135
136 for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
137 {
138 rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
Geoff Lang2a419242014-02-10 13:00:44 -0500139 if (renderer->initialize() == EGL_SUCCESS)
140 {
141 return renderer;
142 }
143 else
144 {
Geoff Lang591e6af2014-06-18 18:08:57 -0400145 // Failed to create the renderer, try the next
Geoff Lang2a419242014-02-10 13:00:44 -0500146 SafeDelete(renderer);
147 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000148 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000149
150 return NULL;
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +0000151}
152
153void glDestroyRenderer(rx::Renderer *renderer)
154{
155 delete renderer;
156}
157
Geoff Lang2a419242014-02-10 13:00:44 -0500158}