Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Context.h « intern « vamr « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fcdd6a41b0e9b8f429063963740533028429543b (plain)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

/** \file
 * \ingroup VAMR
 */

#ifndef __CONTEXT_H__
#define __CONTEXT_H__

#include <memory>
#include <vector>

#include "VAMR_IContext.h"

namespace VAMR {

struct CustomFuncs {
  /** Function to retrieve (possibly create) a graphics context */
  VAMR_GraphicsContextBindFn gpu_ctx_bind_fn{nullptr};
  /** Function to release (possibly free) a graphics context */
  VAMR_GraphicsContextUnbindFn gpu_ctx_unbind_fn{nullptr};

  /** Custom per-view draw function for Blender side drawing. */
  VAMR_DrawViewFn draw_view_fn{nullptr};
};

/**
 * In some occasions, runtime specific handling is needed, e.g. to work around runtime bugs.
 */
enum OpenXRRuntimeID {
  OPENXR_RUNTIME_MONADO,
  OPENXR_RUNTIME_OCULUS,
  OPENXR_RUNTIME_WMR, /* Windows Mixed Reality */

  OPENXR_RUNTIME_UNKNOWN
};

/**
 * \brief Main VAMR container to manage OpenXR through.
 *
 * Creating a context using #VAMR_ContextCreate involves dynamically connecting to the OpenXR
 * runtime, likely reading the OS OpenXR configuration (i.e. active_runtime.json). So this is
 * something that should better be done using lazy-initialization.
 */
class Context : public VAMR::IContext {
 public:
  Context(const VAMR_ContextCreateInfo *create_info);
  ~Context();
  void initialize(const VAMR_ContextCreateInfo *create_info);

  void startSession(const VAMR_SessionBeginInfo *begin_info) override;
  void endSession() override;
  bool isSessionRunning() const override;
  void drawSessionViews(void *draw_customdata) override;

  static void setErrorHandler(VAMR_ErrorHandlerFn handler_fn, void *customdata);
  void dispatchErrorMessage(const class Exception *exception) const override;

  void setGraphicsContextBindFuncs(VAMR_GraphicsContextBindFn bind_fn,
                                   VAMR_GraphicsContextUnbindFn unbind_fn) override;
  void setDrawViewFunc(VAMR_DrawViewFn draw_view_fn) override;

  void handleSessionStateChange(const XrEventDataSessionStateChanged *lifecycle);

  OpenXRRuntimeID getOpenXRRuntimeID() const;
  const CustomFuncs *getCustomFuncs() const;
  VAMR_GraphicsBindingType getGraphicsBindingType() const;
  XrInstance getInstance() const;
  bool isDebugMode() const;
  bool isDebugTimeMode() const;

 private:
  std::unique_ptr<struct OpenXRInstanceData> m_oxr;

  OpenXRRuntimeID m_runtime_id{OPENXR_RUNTIME_UNKNOWN};

  /* The active VAMR XR Session. Null while no session runs. */
  std::unique_ptr<class Session> m_session;

  /** Active graphics binding type. */
  VAMR_GraphicsBindingType m_gpu_binding_type{VAMR_GraphicsBindingTypeUnknown};

  /** Names of enabled extensions */
  std::vector<const char *> m_enabled_extensions;
  /** Names of enabled API-layers */
  std::vector<const char *> m_enabled_layers;

  static VAMR_ErrorHandlerFn s_error_handler;
  static void *s_error_handler_customdata;
  CustomFuncs m_custom_funcs;

  /** Enable debug message prints and OpenXR API validation layers */
  bool m_debug{false};
  bool m_debug_time{false};

  void createOpenXRInstance();
  void storeInstanceProperties();
  void initDebugMessenger();

  void printInstanceInfo();
  void printAvailableAPILayersAndExtensionsInfo();
  void printExtensionsAndAPILayersToEnable();

  void enumerateApiLayers();
  void enumerateExtensions();
  void enumerateExtensionsEx(std::vector<XrExtensionProperties> &extensions,
                             const char *layer_name);
  void getAPILayersToEnable(std::vector<const char *> &r_ext_names);
  void getExtensionsToEnable(std::vector<const char *> &r_ext_names);
  VAMR_GraphicsBindingType determineGraphicsBindingTypeToEnable(
      const VAMR_ContextCreateInfo *create_info);
};

}  // namespace VAMR

#endif  // __CONTEXT_H__