blob: 0665f219f79263b92a6bb22e538d8037f2a61492 [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)
19#include "libGLESv2/renderer/d3d9/Renderer9.h"
20#endif // ANGLE_ENABLE_D3D9
21
22#if defined (ANGLE_ENABLE_D3D11)
23#include "libGLESv2/renderer/d3d11/Renderer11.h"
24#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 Langcec35902014-04-16 10:52:36 -040046const gl::Caps &Renderer::getCaps() const
47{
48 if (!mCapsInitialized)
49 {
50 mCaps = generateCaps();
51 mCapsInitialized = true;
52 }
53
54 return mCaps;
55}
56
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000057}
58
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000059extern "C"
60{
61
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000062rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId)
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000063{
Geoff Lang2a419242014-02-10 13:00:44 -050064#if defined(ANGLE_ENABLE_D3D11)
65 if (ANGLE_DEFAULT_D3D11 ||
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000066 displayId == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
67 displayId == EGL_D3D11_ONLY_DISPLAY_ANGLE)
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +000068 {
Geoff Lang2a419242014-02-10 13:00:44 -050069 rx::Renderer11 *renderer = new rx::Renderer11(display, hDc);
70 if (renderer->initialize() == EGL_SUCCESS)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000071 {
72 return renderer;
73 }
Geoff Lang2a419242014-02-10 13:00:44 -050074 else
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000075 {
Geoff Lang2a419242014-02-10 13:00:44 -050076 // Failed to create a D3D11 renderer, try D3D9
77 SafeDelete(renderer);
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000078 }
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +000079 }
Geoff Lang2a419242014-02-10 13:00:44 -050080#endif
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000081
Geoff Lang2a419242014-02-10 13:00:44 -050082#if defined(ANGLE_ENABLE_D3D9)
83 if (displayId != EGL_D3D11_ONLY_DISPLAY_ANGLE)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000084 {
Geoff Lang64c83242014-05-06 10:49:24 -040085 rx::Renderer9 *renderer = new rx::Renderer9(display, hDc);
Geoff Lang2a419242014-02-10 13:00:44 -050086 if (renderer->initialize() == EGL_SUCCESS)
87 {
88 return renderer;
89 }
90 else
91 {
92 SafeDelete(renderer);
93 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000094 }
Geoff Lang2a419242014-02-10 13:00:44 -050095#endif
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000096
97 return NULL;
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000098}
99
100void glDestroyRenderer(rx::Renderer *renderer)
101{
102 delete renderer;
103}
104
Geoff Lang2a419242014-02-10 13:00:44 -0500105}