blob: 40ea5ecf2ac938deca0fa92f756b3b791f174ccb [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
daniel@transgaming.com25e16af2012-11-28 21:05:57 +000079}
80
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000081extern "C"
82{
83
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000084rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId)
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +000085{
Geoff Lang2a419242014-02-10 13:00:44 -050086#if defined(ANGLE_ENABLE_D3D11)
87 if (ANGLE_DEFAULT_D3D11 ||
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000088 displayId == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
89 displayId == EGL_D3D11_ONLY_DISPLAY_ANGLE)
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +000090 {
Geoff Lang2a419242014-02-10 13:00:44 -050091 rx::Renderer11 *renderer = new rx::Renderer11(display, hDc);
92 if (renderer->initialize() == EGL_SUCCESS)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +000093 {
94 return renderer;
95 }
Geoff Lang2a419242014-02-10 13:00:44 -050096 else
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +000097 {
Geoff Lang2a419242014-02-10 13:00:44 -050098 // Failed to create a D3D11 renderer, try D3D9
99 SafeDelete(renderer);
shannonwoods@chromium.orgeff3a122013-05-30 00:10:04 +0000100 }
daniel@transgaming.comdef9f0f2012-11-28 20:53:20 +0000101 }
Geoff Lang2a419242014-02-10 13:00:44 -0500102#endif
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000103
Geoff Lang2a419242014-02-10 13:00:44 -0500104#if defined(ANGLE_ENABLE_D3D9)
105 if (displayId != EGL_D3D11_ONLY_DISPLAY_ANGLE)
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000106 {
Geoff Lang64c83242014-05-06 10:49:24 -0400107 rx::Renderer9 *renderer = new rx::Renderer9(display, hDc);
Geoff Lang2a419242014-02-10 13:00:44 -0500108 if (renderer->initialize() == EGL_SUCCESS)
109 {
110 return renderer;
111 }
112 else
113 {
114 SafeDelete(renderer);
115 }
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000116 }
Geoff Lang2a419242014-02-10 13:00:44 -0500117#endif
daniel@transgaming.comc1e26342012-11-28 19:31:16 +0000118
119 return NULL;
daniel@transgaming.comae4f4d42012-11-28 19:31:06 +0000120}
121
122void glDestroyRenderer(rx::Renderer *renderer)
123{
124 delete renderer;
125}
126
Geoff Lang2a419242014-02-10 13:00:44 -0500127}