Path: blob/main_old/samples/sample_util/SampleApplication.cpp
1695 views
//1// Copyright 2013 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56#include "SampleApplication.h"78#include "common/debug.h"9#include "util/EGLWindow.h"10#include "util/gles_loader_autogen.h"11#include "util/random_utils.h"12#include "util/shader_utils.h"13#include "util/test_utils.h"14#include "util/util_gl.h"1516#include <string.h>17#include <iostream>18#include <utility>1920#if defined(ANGLE_PLATFORM_WINDOWS)21# include "util/windows/WGLWindow.h"22#endif // defined(ANGLE_PLATFORM_WINDOWS)2324namespace25{26const char *kUseAngleArg = "--use-angle=";27const char *kUseGlArg = "--use-gl=native";2829using DisplayTypeInfo = std::pair<const char *, EGLint>;3031const DisplayTypeInfo kDisplayTypes[] = {32{"d3d9", EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE},33{"d3d11", EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE},34{"gl", EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE},35{"gles", EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE},36{"metal", EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE},37{"null", EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE},38{"swiftshader", EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE},39{"vulkan", EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE},40};4142EGLint GetDisplayTypeFromArg(const char *displayTypeArg)43{44for (const auto &displayTypeInfo : kDisplayTypes)45{46if (strcmp(displayTypeInfo.first, displayTypeArg) == 0)47{48std::cout << "Using ANGLE back-end API: " << displayTypeInfo.first << std::endl;49return displayTypeInfo.second;50}51}5253std::cout << "Unknown ANGLE back-end API: " << displayTypeArg << std::endl;54return EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;55}5657EGLint GetDeviceTypeFromArg(const char *displayTypeArg)58{59if (strcmp(displayTypeArg, "swiftshader") == 0)60{61return EGL_PLATFORM_ANGLE_DEVICE_TYPE_SWIFTSHADER_ANGLE;62}63else64{65return EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE;66}67}6869ANGLE_MAYBE_UNUSED bool IsGLExtensionEnabled(const std::string &extName)70{71return angle::CheckExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),72extName);73}74} // anonymous namespace7576SampleApplication::SampleApplication(std::string name,77int argc,78char **argv,79EGLint glesMajorVersion,80EGLint glesMinorVersion,81uint32_t width,82uint32_t height)83: mName(std::move(name)),84mWidth(width),85mHeight(height),86mRunning(false),87mFrameCount(0),88mGLWindow(nullptr),89mEGLWindow(nullptr),90mOSWindow(nullptr),91mDriverType(angle::GLESDriverType::AngleEGL)92{93mPlatformParams.renderer = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;94bool useNativeGL = false;9596for (int argIndex = 1; argIndex < argc; argIndex++)97{98if (strncmp(argv[argIndex], kUseAngleArg, strlen(kUseAngleArg)) == 0)99{100const char *arg = argv[argIndex] + strlen(kUseAngleArg);101mPlatformParams.renderer = GetDisplayTypeFromArg(arg);102mPlatformParams.deviceType = GetDeviceTypeFromArg(arg);103}104105if (strncmp(argv[argIndex], kUseGlArg, strlen(kUseGlArg)) == 0)106{107useNativeGL = true;108}109}110111mOSWindow = OSWindow::New();112113// Load EGL library so we can initialize the display.114if (useNativeGL)115{116#if defined(ANGLE_PLATFORM_WINDOWS)117mGLWindow = WGLWindow::New(glesMajorVersion, glesMinorVersion);118mEntryPointsLib.reset(angle::OpenSharedLibrary("opengl32", angle::SearchType::SystemDir));119mDriverType = angle::GLESDriverType::SystemWGL;120#else121mGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion);122mEntryPointsLib.reset(angle::OpenSharedLibraryWithExtension(123angle::GetNativeEGLLibraryNameWithExtension(), angle::SearchType::SystemDir));124mDriverType = angle::GLESDriverType::SystemEGL;125#endif // defined(ANGLE_PLATFORM_WINDOWS)126}127else128{129mGLWindow = mEGLWindow = EGLWindow::New(glesMajorVersion, glesMinorVersion);130mEntryPointsLib.reset(131angle::OpenSharedLibrary(ANGLE_EGL_LIBRARY_NAME, angle::SearchType::ModuleDir));132}133}134135SampleApplication::~SampleApplication()136{137GLWindowBase::Delete(&mGLWindow);138OSWindow::Delete(&mOSWindow);139}140141bool SampleApplication::initialize()142{143return true;144}145146void SampleApplication::destroy() {}147148void SampleApplication::step(float dt, double totalTime) {}149150void SampleApplication::draw() {}151152void SampleApplication::swap()153{154mGLWindow->swap();155}156157OSWindow *SampleApplication::getWindow() const158{159return mOSWindow;160}161162EGLConfig SampleApplication::getConfig() const163{164ASSERT(mEGLWindow);165return mEGLWindow->getConfig();166}167168EGLDisplay SampleApplication::getDisplay() const169{170ASSERT(mEGLWindow);171return mEGLWindow->getDisplay();172}173174EGLSurface SampleApplication::getSurface() const175{176ASSERT(mEGLWindow);177return mEGLWindow->getSurface();178}179180EGLContext SampleApplication::getContext() const181{182ASSERT(mEGLWindow);183return mEGLWindow->getContext();184}185186int SampleApplication::run()187{188if (!mOSWindow->initialize(mName, mWidth, mHeight))189{190return -1;191}192193mOSWindow->setVisible(true);194195ConfigParameters configParams;196configParams.redBits = 8;197configParams.greenBits = 8;198configParams.blueBits = 8;199configParams.alphaBits = 8;200configParams.depthBits = 24;201configParams.stencilBits = 8;202203if (!mGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), mDriverType, mPlatformParams,204configParams))205{206return -1;207}208209// Disable vsync210if (!mGLWindow->setSwapInterval(0))211{212return -1;213}214215mRunning = true;216int result = 0;217218#if defined(ANGLE_ENABLE_ASSERTS)219if (IsGLExtensionEnabled("GL_KHR_debug"))220{221EnableDebugCallback(nullptr, nullptr);222}223#endif224225if (!initialize())226{227mRunning = false;228result = -1;229}230231mTimer.start();232double prevTime = 0.0;233234while (mRunning)235{236double elapsedTime = mTimer.getElapsedTime();237double deltaTime = elapsedTime - prevTime;238239step(static_cast<float>(deltaTime), elapsedTime);240241// Clear events that the application did not process from this frame242Event event;243while (popEvent(&event))244{245// If the application did not catch a close event, close now246switch (event.Type)247{248case Event::EVENT_CLOSED:249exit();250break;251case Event::EVENT_KEY_RELEASED:252onKeyUp(event.Key);253break;254case Event::EVENT_KEY_PRESSED:255onKeyDown(event.Key);256break;257default:258break;259}260}261262if (!mRunning)263{264break;265}266267draw();268swap();269270mOSWindow->messageLoop();271272prevTime = elapsedTime;273274mFrameCount++;275276if (mFrameCount % 100 == 0)277{278printf("Rate: %0.2lf frames / second\n",279static_cast<double>(mFrameCount) / mTimer.getElapsedTime());280}281}282283destroy();284mGLWindow->destroyGL();285mOSWindow->destroy();286287return result;288}289290void SampleApplication::exit()291{292mRunning = false;293}294295bool SampleApplication::popEvent(Event *event)296{297return mOSWindow->popEvent(event);298}299300void SampleApplication::onKeyUp(const Event::KeyEvent &keyEvent)301{302// Default no-op.303}304305void SampleApplication::onKeyDown(const Event::KeyEvent &keyEvent)306{307// Default no-op.308}309310311