[Bf-blender-cvs] [3a4034a7411] soc-2019-openxr: Make OpenGL-only session backend work
Julian Eisel
noreply at git.blender.org
Sat Jul 20 19:35:49 CEST 2019
Commit: 3a4034a7411a65455de73bf86dcbb319002de468
Author: Julian Eisel
Date: Sat Jul 20 19:32:06 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB3a4034a7411a65455de73bf86dcbb319002de468
Make OpenGL-only session backend work
Previously, only DirectX HMD rendering would work (and still takes
priority).
===================================================================
M intern/ghost/intern/GHOST_IXrGraphicsBinding.h
M intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
M intern/ghost/intern/GHOST_XrSession.cpp
===================================================================
diff --git a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
index e426312ba30..8470827c2dd 100644
--- a/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXrGraphicsBinding.h
@@ -59,6 +59,7 @@ class GHOST_IXrGraphicsBinding {
uint32_t image_count) = 0;
virtual void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) = 0;
virtual void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
+ const GHOST_XrDrawViewInfo *draw_info,
class GHOST_Context *ogl_ctx) = 0;
protected:
diff --git a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
index 8120dccfcd7..b7c369ac996 100644
--- a/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XrGraphicsBinding.cpp
@@ -55,6 +55,13 @@ static bool choose_swapchain_format_from_candidates(std::vector<int64_t> gpu_bin
class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
public:
+ ~GHOST_XrGraphicsBindingOpenGL()
+ {
+ if (m_fbo != 0) {
+ glDeleteFramebuffers(1, &m_fbo);
+ }
+ }
+
bool checkVersionRequirements(GHOST_Context *ghost_ctx,
XrInstance instance,
XrSystemId system_id,
@@ -106,6 +113,9 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
oxr_binding.wgl.hDC = ctx_wgl->m_hDC;
oxr_binding.wgl.hGLRC = ctx_wgl->m_hGLRC;
#endif
+
+ /* Generate a framebuffer to use for blitting into the texture */
+ glGenFramebuffers(1, &m_fbo);
}
bool chooseSwapchainFormat(const std::vector<int64_t> &runtime_formats,
@@ -135,18 +145,40 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
{
- // TODO
- (void)swapchain_image;
}
- void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image, GHOST_Context *ogl_ctx) override
+ void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
+ const GHOST_XrDrawViewInfo *draw_info,
+ GHOST_Context *ogl_ctx) override
{
- // TODO
- (void)swapchain_image;
- (void)ogl_ctx;
+ XrSwapchainImageOpenGLKHR *ogl_swapchain_image = reinterpret_cast<XrSwapchainImageOpenGLKHR *>(
+ swapchain_image);
+
+ ogl_ctx->activateDrawingContext();
+ ogl_ctx->setDefaultFramebufferSize(draw_info->width, draw_info->height);
+
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo);
+
+ glFramebufferTexture2D(
+ GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ogl_swapchain_image->image, 0);
+
+ glBlitFramebuffer(draw_info->ofsx,
+ draw_info->ofsy,
+ draw_info->ofsx + draw_info->width,
+ draw_info->ofsy + draw_info->height,
+ draw_info->ofsx,
+ draw_info->ofsy,
+ draw_info->ofsx + draw_info->width,
+ draw_info->ofsy + draw_info->height,
+ GL_COLOR_BUFFER_BIT,
+ GL_LINEAR);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
private:
std::list<std::vector<XrSwapchainImageOpenGLKHR>> m_image_cache;
+ GLuint m_fbo{0};
};
#ifdef WIN32
@@ -211,7 +243,9 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
void drawViewBegin(XrSwapchainImageBaseHeader * /*swapchain_image*/) override
{
}
- void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image, GHOST_Context *ogl_ctx) override
+ void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image,
+ const GHOST_XrDrawViewInfo *draw_info,
+ GHOST_Context *ogl_ctx) override
{
XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
swapchain_image);
@@ -229,21 +263,15 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
ID3D11RenderTargetView *rtv;
CD3D11_RENDER_TARGET_VIEW_DESC rtv_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
DXGI_FORMAT_R8G8B8A8_UNORM);
- D3D11_TEXTURE2D_DESC tex_desc;
-
- d3d_swapchain_image->texture->GetDesc(&tex_desc);
m_ghost_ctx->m_device->CreateRenderTargetView(d3d_swapchain_image->texture, &rtv_desc, &rtv);
- m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, rtv, tex_desc.Width, tex_desc.Height);
+ m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, rtv, draw_info->width, draw_info->height);
# else
ID3D11Resource *res;
ID3D11Texture2D *tex;
- D3D11_TEXTURE2D_DESC tex_desc;
-
- d3d_swapchain_image->texture->GetDesc(&tex_desc);
ogl_ctx->activateDrawingContext();
- m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, tex_desc.Width, tex_desc.Height);
+ m_ghost_ctx->blitOpenGLOffscreenContext(ogl_ctx, draw_info->width, draw_info->height);
m_ghost_ctx->m_backbuffer_view->GetResource(&res);
res->QueryInterface<ID3D11Texture2D>(&tex);
diff --git a/intern/ghost/intern/GHOST_XrSession.cpp b/intern/ghost/intern/GHOST_XrSession.cpp
index 2e85c22faad..fbf86fcbb83 100644
--- a/intern/ghost/intern/GHOST_XrSession.cpp
+++ b/intern/ghost/intern/GHOST_XrSession.cpp
@@ -415,7 +415,7 @@ void GHOST_XrSession::drawView(XrSwapchain swapchain,
m_gpu_binding->drawViewBegin(swapchain_image);
draw_ctx = m_context->getCustomFuncs()->draw_view_fn(&draw_view_info, draw_customdata);
- m_gpu_binding->drawViewEnd(swapchain_image, (GHOST_Context *)draw_ctx);
+ m_gpu_binding->drawViewEnd(swapchain_image, &draw_view_info, (GHOST_Context *)draw_ctx);
CHECK_XR(xrReleaseSwapchainImage(swapchain, &release_info),
"Failed to release swapchain image used to submit VR session frame.");
More information about the Bf-blender-cvs
mailing list