25 #if defined(WITH_GHOST_X11)
38 const std::vector<int64_t> &gpu_binding_formats,
const std::vector<int64_t> &runtime_formats)
40 if (gpu_binding_formats.empty()) {
44 auto res = std::find_first_of(gpu_binding_formats.begin(),
45 gpu_binding_formats.end(),
46 runtime_formats.begin(),
47 runtime_formats.end());
48 if (res == gpu_binding_formats.end()) {
60 glDeleteFramebuffers(1, &m_fbo);
67 std::string *r_requirement_info)
const override
69 #if defined(WITH_GHOST_X11)
74 static PFN_xrGetOpenGLGraphicsRequirementsKHR s_xrGetOpenGLGraphicsRequirementsKHR_fn =
76 XrGraphicsRequirementsOpenGLKHR gpu_requirements = {XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR};
77 const XrVersion gl_version = XR_MAKE_VERSION(
78 ctx_gl.m_contextMajorVersion, ctx_gl.m_contextMinorVersion, 0);
80 if (!s_xrGetOpenGLGraphicsRequirementsKHR_fn &&
81 XR_FAILED(xrGetInstanceProcAddr(
83 "xrGetOpenGLGraphicsRequirementsKHR",
84 (PFN_xrVoidFunction *)&s_xrGetOpenGLGraphicsRequirementsKHR_fn))) {
85 s_xrGetOpenGLGraphicsRequirementsKHR_fn =
nullptr;
88 s_xrGetOpenGLGraphicsRequirementsKHR_fn(instance, system_id, &gpu_requirements);
90 if (r_requirement_info) {
91 std::ostringstream strstream;
92 strstream <<
"Min OpenGL version "
93 << XR_VERSION_MAJOR(gpu_requirements.minApiVersionSupported) <<
"."
94 << XR_VERSION_MINOR(gpu_requirements.minApiVersionSupported) << std::endl;
95 strstream <<
"Max OpenGL version "
96 << XR_VERSION_MAJOR(gpu_requirements.maxApiVersionSupported) <<
"."
97 << XR_VERSION_MINOR(gpu_requirements.maxApiVersionSupported) << std::endl;
99 *r_requirement_info = strstream.str();
102 return (gl_version >= gpu_requirements.minApiVersionSupported) &&
103 (gl_version <= gpu_requirements.maxApiVersionSupported);
108 #if defined(WITH_GHOST_X11)
110 XVisualInfo *visual_info = glXGetVisualFromFBConfig(ctx_glx.m_display, ctx_glx.m_fbconfig);
112 oxr_binding.glx.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR;
123 oxr_binding.wgl.type = XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR;
129 glGenFramebuffers(1, &m_fbo);
133 bool &r_is_srgb_format)
const override
135 std::vector<int64_t> gpu_binding_formats = {
142 r_is_srgb_format =
result ? (*
result == GL_SRGB8_ALPHA8) :
false;
149 std::vector<XrSwapchainImageOpenGLKHR> ogl_images(image_count);
150 std::vector<XrSwapchainImageBaseHeader *> base_images;
154 for (XrSwapchainImageOpenGLKHR &image : ogl_images) {
155 image.type = XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR;
156 base_images.push_back(
reinterpret_cast<XrSwapchainImageBaseHeader *
>(&image));
160 m_image_cache.push_back(std::move(ogl_images));
166 const GHOST_XrDrawViewInfo &draw_info)
override
168 XrSwapchainImageOpenGLKHR &ogl_swapchain_image =
reinterpret_cast<XrSwapchainImageOpenGLKHR &
>(
171 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
173 glFramebufferTexture2D(
174 GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ogl_swapchain_image.image, 0);
176 glBlitFramebuffer(draw_info.ofsx,
178 draw_info.ofsx + draw_info.width,
179 draw_info.ofsy + draw_info.height,
182 draw_info.ofsx + draw_info.width,
183 draw_info.ofsy + draw_info.height,
187 glBindFramebuffer(GL_FRAMEBUFFER, 0);
196 std::list<std::vector<XrSwapchainImageOpenGLKHR>> m_image_cache;
208 ~GHOST_XrGraphicsBindingD3D()
210 if (m_shared_resource) {
211 m_ghost_d3d_ctx->disposeSharedOpenGLResource(m_shared_resource);
213 if (m_ghost_d3d_ctx) {
221 XrSystemId system_id,
222 std::string *r_requirement_info)
const override
224 static PFN_xrGetD3D11GraphicsRequirementsKHR s_xrGetD3D11GraphicsRequirementsKHR_fn =
nullptr;
225 XrGraphicsRequirementsD3D11KHR gpu_requirements = {XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR};
227 if (!s_xrGetD3D11GraphicsRequirementsKHR_fn &&
228 XR_FAILED(xrGetInstanceProcAddr(
230 "xrGetD3D11GraphicsRequirementsKHR",
231 (PFN_xrVoidFunction *)&s_xrGetD3D11GraphicsRequirementsKHR_fn))) {
232 s_xrGetD3D11GraphicsRequirementsKHR_fn =
nullptr;
235 s_xrGetD3D11GraphicsRequirementsKHR_fn(instance, system_id, &gpu_requirements);
237 if (r_requirement_info) {
238 std::ostringstream strstream;
239 strstream <<
"Minimum DirectX 11 Feature Level " << gpu_requirements.minFeatureLevel
242 *r_requirement_info = std::move(strstream.str());
245 return m_ghost_d3d_ctx->m_device->GetFeatureLevel() >= gpu_requirements.minFeatureLevel;
252 oxr_binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR;
253 oxr_binding.d3d11.device = m_ghost_d3d_ctx->m_device;
257 bool &r_is_srgb_format)
const override
259 std::vector<int64_t> gpu_binding_formats = {
272 std::vector<XrSwapchainImageD3D11KHR> d3d_images(image_count);
273 std::vector<XrSwapchainImageBaseHeader *> base_images;
277 for (XrSwapchainImageD3D11KHR &image : d3d_images) {
278 image.type = XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR;
279 base_images.push_back(
reinterpret_cast<XrSwapchainImageBaseHeader *
>(&image));
283 m_image_cache.push_back(std::move(d3d_images));
289 const GHOST_XrDrawViewInfo &draw_info)
override
291 XrSwapchainImageD3D11KHR &d3d_swapchain_image =
reinterpret_cast<XrSwapchainImageD3D11KHR &
>(
301 ID3D11RenderTargetView *rtv;
302 CD3D11_RENDER_TARGET_VIEW_DESC rtv_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
305 m_ghost_ctx->m_device->CreateRenderTargetView(d3d_swapchain_image.texture, &rtv_desc, &rtv);
306 if (!m_shared_resource) {
307 m_shared_resource = m_ghost_ctx->createSharedOpenGLResource(
308 draw_info.width, draw_info.height, rtv);
310 m_ghost_ctx->blitFromOpenGLContext(m_shared_resource, draw_info.width, draw_info.height);
312 if (!m_shared_resource) {
313 m_shared_resource = m_ghost_d3d_ctx->createSharedOpenGLResource(draw_info.width,
316 m_ghost_d3d_ctx->blitFromOpenGLContext(m_shared_resource, draw_info.width, draw_info.height);
318 m_ghost_d3d_ctx->m_device_ctx->OMSetRenderTargets(0,
nullptr,
nullptr);
319 m_ghost_d3d_ctx->m_device_ctx->CopyResource(
320 d3d_swapchain_image.texture, m_ghost_d3d_ctx->getSharedTexture2D(m_shared_resource));
326 return m_ghost_d3d_ctx->isUpsideDown();
337 std::list<std::vector<XrSwapchainImageD3D11KHR>> m_image_cache;
345 case GHOST_kXrGraphicsOpenGL:
346 return std::make_unique<GHOST_XrGraphicsBindingOpenGL>();
348 case GHOST_kXrGraphicsD3D11:
349 return std::make_unique<GHOST_XrGraphicsBindingD3D>(
context);
@ DXGI_FORMAT_R8G8B8A8_UNORM
@ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
GHOST C-API function and type declarations.
std::unique_ptr< GHOST_IXrGraphicsBinding > GHOST_XrGraphicsBindingCreateFromType(GHOST_TXrGraphicsBinding type, GHOST_Context &context)
static std::optional< int64_t > choose_swapchain_format_from_candidates(const std::vector< int64_t > &gpu_binding_formats, const std::vector< int64_t > &runtime_formats)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
virtual bool isUpsideDown() const
virtual bool needsUpsideDownDrawing(GHOST_Context &ghost_ctx) const =0
virtual bool checkVersionRequirements(class GHOST_Context &ghost_ctx, XrInstance instance, XrSystemId system_id, std::string *r_requirement_info) const =0
virtual void initFromGhostContext(class GHOST_Context &ghost_ctx)=0
union GHOST_IXrGraphicsBinding::@1230 oxr_binding
virtual std::vector< XrSwapchainImageBaseHeader * > createSwapchainImages(uint32_t image_count)=0
virtual std::optional< int64_t > chooseSwapchainFormat(const std::vector< int64_t > &runtime_formats, bool &r_is_rgb_format) const =0
virtual void submitToSwapchainImage(XrSwapchainImageBaseHeader &swapchain_image, const GHOST_XrDrawViewInfo &draw_info)=0
static GHOST_ContextD3D * createOffscreenContextD3D()
static GHOST_TSuccess disposeContextD3D(GHOST_ContextD3D *context)
~GHOST_XrGraphicsBindingOpenGL()
bool needsUpsideDownDrawing(GHOST_Context &ghost_ctx) const override
std::vector< XrSwapchainImageBaseHeader * > createSwapchainImages(uint32_t image_count) override
void initFromGhostContext(GHOST_Context &ghost_ctx) override
std::optional< int64_t > chooseSwapchainFormat(const std::vector< int64_t > &runtime_formats, bool &r_is_srgb_format) const override
bool checkVersionRequirements(GHOST_Context &ghost_ctx, XrInstance instance, XrSystemId system_id, std::string *r_requirement_info) const override
void submitToSwapchainImage(XrSwapchainImageBaseHeader &swapchain_image, const GHOST_XrDrawViewInfo &draw_info) override
struct SELECTID_Context context