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