Hash :
7df7fc7f
Author :
Date :
2021-06-20T00:05:28
Tests: Add support for --renderdoc This change adds support for a new flag namely `--renderdoc` to end2end and deqp tests. With this flag, each test automatically starts and ends a frame capture in renderdoc, working around an issue where renderdoc refuses to capture a test frame that doesn't start or end with a swap. With end2end tests, the capture starts before test set up, and ends after test tear down. With deqp tests, it starts before init, ends and restarts after each test iteration and ends after deinit. Bug: angleproject:6072 Change-Id: Ib41b816aff121bf922d9147044cc363c33a62181 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2971835 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// system_utils_win32.cpp: Implementation of OS-specific functions for Windows.
#include "system_utils.h"
#include <windows.h>
#include <array>
namespace angle
{
bool UnsetEnvironmentVar(const char *variableName)
{
return (SetEnvironmentVariableA(variableName, nullptr) == TRUE);
}
bool SetEnvironmentVar(const char *variableName, const char *value)
{
return (SetEnvironmentVariableA(variableName, value) == TRUE);
}
std::string GetEnvironmentVar(const char *variableName)
{
std::array<char, MAX_PATH> oldValue;
DWORD result =
GetEnvironmentVariableA(variableName, oldValue.data(), static_cast<DWORD>(oldValue.size()));
if (result == 0)
{
return std::string();
}
else
{
return std::string(oldValue.data());
}
}
class Win32Library : public Library
{
public:
Win32Library(const char *libraryName, SearchType searchType)
{
switch (searchType)
{
case SearchType::ApplicationDir:
mModule = LoadLibraryA(libraryName);
break;
case SearchType::SystemDir:
mModule = LoadLibraryExA(libraryName, nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32);
break;
case SearchType::AlreadyLoaded:
mModule = GetModuleHandleA(libraryName);
break;
}
}
~Win32Library() override
{
if (mModule)
{
FreeLibrary(mModule);
}
}
void *getSymbol(const char *symbolName) override
{
if (!mModule)
{
fprintf(stderr, "Module was not loaded\n");
return nullptr;
}
return reinterpret_cast<void *>(GetProcAddress(mModule, symbolName));
}
void *getNative() const override { return reinterpret_cast<void *>(mModule); }
private:
HMODULE mModule = nullptr;
};
Library *OpenSharedLibrary(const char *libraryName, SearchType searchType)
{
char buffer[MAX_PATH];
int ret = snprintf(buffer, MAX_PATH, "%s.%s", libraryName, GetSharedLibraryExtension());
if (ret > 0 && ret < MAX_PATH)
{
return new Win32Library(buffer, searchType);
}
else
{
fprintf(stderr, "Error loading shared library: 0x%x", ret);
return nullptr;
}
}
Library *OpenSharedLibraryWithExtension(const char *libraryName)
{
return new Win32Library(libraryName, SearchType::SystemDir);
}
} // namespace angle