[Bf-blender-cvs] [4b674777328] soc-2019-openxr: Own FBO for VR viewport to get previous changes to work
Julian Eisel
noreply at git.blender.org
Sat Aug 24 03:16:32 CEST 2019
Commit: 4b6747773283b0c4028c3c224d37e6fe69ae097a
Author: Julian Eisel
Date: Sat Aug 24 03:15:25 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rB4b6747773283b0c4028c3c224d37e6fe69ae097a
Own FBO for VR viewport to get previous changes to work
===================================================================
M intern/ghost/intern/GHOST_ContextD3D.cpp
M source/blender/windowmanager/intern/wm_xr.c
===================================================================
diff --git a/intern/ghost/intern/GHOST_ContextD3D.cpp b/intern/ghost/intern/GHOST_ContextD3D.cpp
index b9bdb28dd7e..605a52905b1 100644
--- a/intern/ghost/intern/GHOST_ContextD3D.cpp
+++ b/intern/ghost/intern/GHOST_ContextD3D.cpp
@@ -240,11 +240,13 @@ class GHOST_SharedOpenGLResource {
}
}
- GHOST_TSuccess blit()
+ GHOST_TSuccess blit(unsigned int width, unsigned int height)
{
GLint fbo;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fbo);
+ ensureUpdated(width, height);
+
const float clear_col[] = {0.8f, 0.5f, 1.0f, 1.0f};
m_device_ctx->ClearRenderTargetView(m_render_target, clear_col);
m_device_ctx->OMSetRenderTargets(1, &m_render_target, nullptr);
@@ -260,17 +262,7 @@ class GHOST_SharedOpenGLResource {
/* No glBlitNamedFramebuffer, gotta be 3.3 compatible. */
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_shared.fbo);
- glBlitFramebuffer(0,
- 0,
- m_cur_width,
- m_cur_height,
- 0,
- 0,
- m_cur_width,
- m_cur_height,
- GL_COLOR_BUFFER_BIT,
- GL_LINEAR);
+ glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
@@ -332,8 +324,7 @@ GHOST_TSuccess GHOST_ContextD3D::blitFromOpenGLContext(GHOST_SharedOpenGLResourc
unsigned int width,
unsigned int height)
{
- shared_res->ensureUpdated(width, height);
- return shared_res->blit();
+ return shared_res->blit(width, height);
}
ID3D11Texture2D *GHOST_ContextD3D::getSharedTexture2D(GHOST_SharedOpenGLResource *shared_res)
diff --git a/source/blender/windowmanager/intern/wm_xr.c b/source/blender/windowmanager/intern/wm_xr.c
index 8ce691958d5..2ee75be9cf3 100644
--- a/source/blender/windowmanager/intern/wm_xr.c
+++ b/source/blender/windowmanager/intern/wm_xr.c
@@ -63,6 +63,9 @@ typedef struct {
GHOST_TXrGraphicsBinding gpu_binding_type;
GPUOffScreen *offscreen;
GPUViewport *viewport;
+ GPUFrameBuffer *fbo;
+ GPUTexture *fbo_tex;
+ bool viewport_bound;
GHOST_ContextHandle secondary_ghost_ctx;
} wmXrSurfaceData;
@@ -230,6 +233,21 @@ void wm_xr_session_toggle(bContext *C, void *xr_context_ptr)
*
* \{ */
+static void wm_xr_surface_viewport_bind(wmXrSurfaceData *surface_data, const rcti *rect)
+{
+ if (surface_data->viewport_bound == false) {
+ GPU_viewport_bind(surface_data->viewport, rect);
+ }
+ surface_data->viewport_bound = true;
+}
+static void wm_xr_surface_viewport_unbind(wmXrSurfaceData *surface_data)
+{
+ if (surface_data->viewport_bound) {
+ GPU_viewport_unbind(surface_data->viewport);
+ }
+ surface_data->viewport_bound = false;
+}
+
/**
* \brief Call Ghost-XR to draw a frame
*
@@ -248,7 +266,7 @@ static void wm_xr_session_surface_draw(bContext *C)
GHOST_XrSessionDrawViews(wm->xr_context, C);
if (surface_data->viewport) {
/* Still bound from view drawing. */
- GPU_viewport_unbind(surface_data->viewport);
+ wm_xr_surface_viewport_unbind(surface_data);
}
}
@@ -272,6 +290,12 @@ static void wm_xr_session_free_data(wmSurface *surface)
if (data->offscreen) {
GPU_offscreen_free(data->offscreen);
}
+ if (data->fbo) {
+ GPU_framebuffer_free(data->fbo);
+ }
+ if (data->fbo_tex) {
+ GPU_texture_free(data->fbo_tex);
+ }
DRW_opengl_context_disable_ex(false);
MEM_freeN(surface->customdata);
@@ -308,6 +332,13 @@ static bool wm_xr_session_surface_offscreen_ensure(const GHOST_XrDrawViewInfo *d
GPU_offscreen_free(surface_data->offscreen);
failure = true;
}
+
+ surface_data->fbo = GPU_framebuffer_create();
+ surface_data->fbo_tex = GPU_texture_create_2d(
+ draw_view->width, draw_view->height, GPU_RGBA8, NULL, NULL);
+ GPU_framebuffer_ensure_config(
+ &surface_data->fbo, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(surface_data->fbo_tex)});
+
DRW_opengl_context_disable();
if (failure) {
@@ -435,7 +466,7 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
offscreen = surface_data->offscreen;
viewport = surface_data->viewport;
- GPU_viewport_bind(viewport, &rect);
+ wm_xr_surface_viewport_bind(surface_data, &rect);
glClear(GL_DEPTH_BUFFER_BIT);
BKE_screen_view3d_shading_init(&shading);
@@ -462,12 +493,11 @@ GHOST_ContextHandle wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void
offscreen,
viewport);
- GPU_framebuffer_restore();
+ GPU_framebuffer_bind(surface_data->fbo);
GPUTexture *texture = GPU_offscreen_color_texture(offscreen);
wm_draw_offscreen_texture_parameters(offscreen);
- GPU_depth_test(false);
wmViewport(&rect);
if (surface_data->secondary_ghost_ctx &&
More information about the Bf-blender-cvs
mailing list