1ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com//
2cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang// Copyright (c) 2012-2014 The ANGLE Project Authors. All rights reserved.
3ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
4ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com// found in the LICENSE file.
5ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com//
6ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
7ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com// Renderer.cpp: Implements EGL dependencies for creating and destroying Renderer instances.
8ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
925e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com#include "libGLESv2/main.h"
1025e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com#include "libGLESv2/Program.h"
11ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com#include "libGLESv2/renderer/Renderer.h"
12a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/utilities.h"
133c6344e7ad0fa7353b0a9d178992a2729dc24455Al Patrick#include "third_party/trace_event/trace_event.h"
14bde4c2f7be2a09a8ca8b9bb1f71e5d06ec1fba92Jamie Madill#include "libGLESv2/Shader.h"
15c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com
162a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang#if defined (ANGLE_ENABLE_D3D9)
17c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
182a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang#endif // ANGLE_ENABLE_D3D9
192a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang
202a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang#if defined (ANGLE_ENABLE_D3D11)
21c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
222a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang#endif // ANGLE_ENABLE_D3D11
232a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang
242a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang#if !defined(ANGLE_DEFAULT_D3D11)
25eff3a1272e72ef04e66d1aaf22d934a59627c781shannonwoods@chromium.org// Enables use of the Direct3D 11 API for a default display, when available
26f81e69b962743b395d0f22d3cc6d714ac5e3e0d2Jamie Madill#define ANGLE_DEFAULT_D3D11 0
27c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com#endif
28ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
290b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include <EGL/eglext.h>
300b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang
3125e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.comnamespace rx
3225e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com{
3325e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com
34cec3590a151059813b91b33cd5e000c94f5bccaaGeoff LangRenderer::Renderer(egl::Display *display)
35cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    : mDisplay(display),
36cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang      mCapsInitialized(false),
37cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang      mCurrentClientVersion(2)
3825e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com{
3925e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com}
4025e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com
41bde4c2f7be2a09a8ca8b9bb1f71e5d06ec1fba92Jamie MadillRenderer::~Renderer()
42bde4c2f7be2a09a8ca8b9bb1f71e5d06ec1fba92Jamie Madill{
43bde4c2f7be2a09a8ca8b9bb1f71e5d06ec1fba92Jamie Madill}
44bde4c2f7be2a09a8ca8b9bb1f71e5d06ec1fba92Jamie Madill
45c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst gl::Caps &Renderer::getRendererCaps() const
46cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang{
47cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    if (!mCapsInitialized)
48cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    {
49c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        generateCaps(&mCaps, &mTextureCaps, &mExtensions);
50cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang        mCapsInitialized = true;
51cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    }
52cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang
53cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang    return mCaps;
54cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang}
55cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang
56c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst gl::TextureCapsMap &Renderer::getRendererTextureCaps() const
57c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang{
58c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    if (!mCapsInitialized)
59c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    {
60c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        generateCaps(&mCaps, &mTextureCaps, &mExtensions);
61c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        mCapsInitialized = true;
62c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    }
63c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
64c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    return mTextureCaps;
65c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang}
66c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
67c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Langconst gl::Extensions &Renderer::getRendererExtensions() const
68c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang{
69c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    if (!mCapsInitialized)
70c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    {
71c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        generateCaps(&mCaps, &mTextureCaps, &mExtensions);
72c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang        mCapsInitialized = true;
73c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    }
74c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
75c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang    return mExtensions;
76c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang}
77c0b9ef4bce04077046ca57b9bc249f26e42d07caGeoff Lang
78591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Langtypedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
79591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
80591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Langtemplate <typename RendererType>
81591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff LangRenderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
82591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang{
83591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    return new RendererType(display, nativeDisplay, requestedDisplayType);
84591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang}
85591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
8625e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com}
8725e16afcef3dc214789acb141c959d45a1f000b9daniel@transgaming.com
88ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.comextern "C"
89ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com{
90ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
91591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Langrx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
92ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com{
93591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
94591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
95591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#   if defined(ANGLE_ENABLE_D3D11)
96591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
97591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
98591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
99591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
100c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com        {
101591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
102c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com        }
103591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#   endif
104591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
105591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#   if defined(ANGLE_ENABLE_D3D9)
106591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
107591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
108eff3a1272e72ef04e66d1aaf22d934a59627c781shannonwoods@chromium.org        {
109591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
110eff3a1272e72ef04e66d1aaf22d934a59627c781shannonwoods@chromium.org        }
111591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#   endif
112591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang
113591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
114591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
115591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
116591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    {
117591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        // The default display is requested, try the D3D9 and D3D11 renderers, order them using
118591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        // the definition of ANGLE_DEFAULT_D3D11
119e3929050250c2aba21ffd2a98023a2209f5a0a97Jamie Madill#       if ANGLE_DEFAULT_D3D11
120591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           if defined(ANGLE_ENABLE_D3D11)
121591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang                rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
122591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           endif
123591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           if defined(ANGLE_ENABLE_D3D9)
124591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang                rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
125591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           endif
126591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#       else
127591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           if defined(ANGLE_ENABLE_D3D9)
128591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang                rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
129591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           endif
130591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           if defined(ANGLE_ENABLE_D3D11)
131591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang                rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
132591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#           endif
133591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang#       endif
134c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com    }
135c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com
136591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang    for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
137c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com    {
138591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang        rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
1392a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        if (renderer->initialize() == EGL_SUCCESS)
1402a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        {
1412a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang            return renderer;
1422a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        }
1432a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        else
1442a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        {
145591e6afe5a73c9ced13dfef2c2e18fd5531e1d8eGeoff Lang            // Failed to create the renderer, try the next
1462a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang            SafeDelete(renderer);
1472a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang        }
148c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com    }
149c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com
150c1e263411a97e7fac60ecb0c6681d7141742da88daniel@transgaming.com    return NULL;
151ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com}
152ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
153ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.comvoid glDestroyRenderer(rx::Renderer *renderer)
154ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com{
155ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com    delete renderer;
156ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com}
157ae4f4d4b930280d58634365d1a9206984ef30723daniel@transgaming.com
1582a41924436ebac74fd3479e15d18c356e6616d0aGeoff Lang}
159