Hash :
58bb11ca
Author :
Date :
2021-04-16T12:28:50
Capture/Replay: Multi-Context Support Add support for capturing and replaying multiple contexts. 1.) Create and initialize the Contexts in the share group during SetupReplay(). 2.) Track the Context the command stream is for, and if the Context ID changes, inject an eglMakeCurrent() call to switch to the new Context. 3.) Intercept eglCreateContext() and eglMakeCurrent() to route to either EGLWindow or WGLWindow, depending on the current platform. Specifically, this enables capturing and replaying Asphalt 9. Bug: angleproject:5878 Change-Id: I5bc9b7ece5388ce405ba3f9e9dc3967e78662000 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2830145 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Cody Northrop <cnorthrop@google.com>
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
//
// Copyright 2018 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.
//
// WGLWindow:
// Implements initializing a WGL rendering context.
//
#ifndef UTIL_WINDOWS_WGLWINDOW_H_
#define UTIL_WINDOWS_WGLWINDOW_H_
#include "common/angleutils.h"
#include "export.h"
#include "util/EGLWindow.h"
class OSWindow;
namespace angle
{
class Library;
} // namespace angle
class ANGLE_UTIL_EXPORT WGLWindow : public GLWindowBase
{
public:
static WGLWindow *New(int glesMajorVersion, int glesMinorVersion);
static void Delete(WGLWindow **window);
// Internally initializes GL resources.
bool initializeGL(OSWindow *osWindow,
angle::Library *glWindowingLibrary,
angle::GLESDriverType driverType,
const EGLPlatformParameters &platformParams,
const ConfigParameters &configParams) override;
void destroyGL() override;
bool isGLInitialized() const override;
bool makeCurrent() override;
void swap() override;
bool hasError() const override;
bool setSwapInterval(EGLint swapInterval) override;
angle::GenericProc getProcAddress(const char *name) override;
// Initializes WGL resources.
GLWindowContext getCurrentContextGeneric() override;
GLWindowContext createContextGeneric(GLWindowContext share) override;
bool makeCurrentGeneric(GLWindowContext context) override;
// Create a WGL context with this window's configuration
HGLRC createContext(const ConfigParameters &configParams, HGLRC shareContext);
// Make the WGL context current
bool makeCurrent(HGLRC context);
private:
WGLWindow(int glesMajorVersion, int glesMinorVersion);
~WGLWindow() override;
// OS resources.
HDC mDeviceContext;
HGLRC mWGLContext;
HWND mWindow;
};
#endif // UTIL_WINDOWS_WGLWINDOW_H_