[Bf-blender-cvs] [da44a02d00c] soc-2019-openxr: The first pixels pushed to Windows Mixed Reality HMDs!
Julian Eisel
noreply at git.blender.org
Thu Jun 27 19:22:20 CEST 2019
Commit: da44a02d00ca9431ce232b9ac83009f0b3ab57a5
Author: Julian Eisel
Date: Mon Jun 24 21:22:23 2019 +0200
Branches: soc-2019-openxr
https://developer.blender.org/rBda44a02d00ca9431ce232b9ac83009f0b3ab57a5
The first pixels pushed to Windows Mixed Reality HMDs!
Just a clear call for now, so all you see is a blue world. This blue
"world" is however drawn by Blender!
Also fixes use after destruction of compositor layer data.
===================================================================
M intern/ghost/intern/GHOST_ContextD3D.cpp
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_ContextD3D.cpp b/intern/ghost/intern/GHOST_ContextD3D.cpp
index 2f3e28a28b2..6a617824856 100644
--- a/intern/ghost/intern/GHOST_ContextD3D.cpp
+++ b/intern/ghost/intern/GHOST_ContextD3D.cpp
@@ -176,7 +176,7 @@ GHOST_TSuccess GHOST_ContextD3D::initializeDrawingContext()
DXGI_SWAP_CHAIN_DESC sd{};
- sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+ sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.SampleDesc.Count = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 3;
diff --git a/intern/ghost/intern/GHOST_IXRGraphicsBinding.h b/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
index 794153f251f..60b2304b239 100644
--- a/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
+++ b/intern/ghost/intern/GHOST_IXRGraphicsBinding.h
@@ -44,6 +44,8 @@ class GHOST_IXrGraphicsBinding {
int64_t *r_result) const = 0;
virtual std::vector<XrSwapchainImageBaseHeader *> createSwapchainImages(
uint32_t image_count) = 0;
+ virtual void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) = 0;
+ virtual void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image) = 0;
protected:
/* Use GHOST_XrGraphicsBindingCreateFromType */
diff --git a/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp b/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
index f42fa0fe059..d08940a951e 100644
--- a/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
+++ b/intern/ghost/intern/GHOST_XRGraphicsBinding.cpp
@@ -100,6 +100,17 @@ class GHOST_XrGraphicsBindingOpenGL : public GHOST_IXrGraphicsBinding {
return base_images;
}
+ void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
+ {
+ // TODO
+ (void)swapchain_image;
+ }
+ void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image) override
+ {
+ // TODO
+ (void)swapchain_image;
+ }
+
private:
std::list<std::vector<XrSwapchainImageOpenGLKHR>> m_image_cache;
};
@@ -113,6 +124,7 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
oxr_binding.d3d11.type = XR_TYPE_GRAPHICS_BINDING_D3D11_KHR;
oxr_binding.d3d11.device = ctx_d3d->m_device.Get();
+ m_ghost_ctx = ctx_d3d;
}
bool chooseSwapchainFormat(std::vector<int64_t> runtime_formats,
@@ -140,7 +152,30 @@ class GHOST_XrGraphicsBindingD3D : public GHOST_IXrGraphicsBinding {
return base_images;
}
+ void drawViewBegin(XrSwapchainImageBaseHeader *swapchain_image) override
+ {
+ // Can't we simply use the backbuffer texture? Didn't work in initial test.
+
+ XrSwapchainImageD3D11KHR *d3d_swapchain_image = reinterpret_cast<XrSwapchainImageD3D11KHR *>(
+ swapchain_image);
+ const CD3D11_RENDER_TARGET_VIEW_DESC render_target_view_desc(D3D11_RTV_DIMENSION_TEXTURE2D,
+ DXGI_FORMAT_R8G8B8A8_UNORM);
+ Microsoft::WRL::ComPtr<ID3D11RenderTargetView> renderTargetView;
+ m_ghost_ctx->m_device->CreateRenderTargetView(d3d_swapchain_image->texture,
+ &render_target_view_desc,
+ renderTargetView.ReleaseAndGetAddressOf());
+
+ const float clear_col[] = {0.2f, 0.5f, 0.8f, 1.0f};
+ m_ghost_ctx->m_device_ctx->ClearRenderTargetView(renderTargetView.Get(), clear_col);
+ }
+ void drawViewEnd(XrSwapchainImageBaseHeader *swapchain_image) override
+ {
+ // TODO
+ (void)swapchain_image;
+ }
+
private:
+ GHOST_ContextD3D *m_ghost_ctx;
std::list<std::vector<XrSwapchainImageD3D11KHR>> m_image_cache;
};
#endif // WIN32
diff --git a/intern/ghost/intern/GHOST_XRSession.cpp b/intern/ghost/intern/GHOST_XRSession.cpp
index 11bd65b20fe..84193b2f13f 100644
--- a/intern/ghost/intern/GHOST_XRSession.cpp
+++ b/intern/ghost/intern/GHOST_XRSession.cpp
@@ -227,7 +227,8 @@ void drawing_end(GHOST_XrContext *xr_context, std::vector<XrCompositionLayerBase
xr_context->draw_frame = nullptr;
}
-static void draw_view(OpenXRData *oxr,
+static void draw_view(GHOST_XrContext *xr_context,
+ OpenXRData *oxr,
XrSwapchain swapchain,
XrCompositionLayerProjectionView &proj_layer_view,
XrView &view)
@@ -252,19 +253,22 @@ static void draw_view(OpenXRData *oxr,
swapchain_image = oxr->swapchain_images[swapchain][swapchain_idx];
- // xr_context->draw_view_fn();
+ xr_context->gpu_binding->drawViewBegin(swapchain_image);
+ // xr_context->draw_view_fn();
+ xr_context->gpu_binding->drawViewEnd(swapchain_image);
xrReleaseSwapchainImage(swapchain, &release_info);
}
-static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
- OpenXRData *oxr,
- XrSpace space)
+static XrCompositionLayerProjection draw_layer(
+ GHOST_XrContext *xr_context,
+ OpenXRData *oxr,
+ XrSpace space,
+ std::vector<XrCompositionLayerProjectionView> &proj_layer_views)
{
XrViewLocateInfo viewloc_info{XR_TYPE_VIEW_LOCATE_INFO};
XrViewState view_state{XR_TYPE_VIEW_STATE};
XrCompositionLayerProjection layer{XR_TYPE_COMPOSITION_LAYER_PROJECTION};
- std::vector<XrCompositionLayerProjectionView> proj_layer_views;
uint32_t view_count;
viewloc_info.displayTime = xr_context->draw_frame->frame_state.predictedDisplayTime;
@@ -277,7 +281,11 @@ static XrCompositionLayerProjection draw_layer(GHOST_XrContext *xr_context,
proj_layer_views.resize(view_count);
for (uint32_t view_idx = 0; view_idx < view_count; view_idx++) {
- draw_view(oxr, oxr->swapchains[view_idx], proj_layer_views[view_idx], oxr->views[view_idx]);
+ draw_view(xr_context,
+ oxr,
+ oxr->swapchains[view_idx],
+ proj_layer_views[view_idx],
+ oxr->views[view_idx]);
}
layer.space = space;
@@ -291,6 +299,8 @@ void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
{
OpenXRData *oxr = &xr_context->oxr;
XrReferenceSpaceCreateInfo refspace_info{XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
+ std::vector<XrCompositionLayerProjectionView>
+ projection_layer_views; // Keep alive until xrEndFrame() call!
XrCompositionLayerProjection proj_layer;
std::vector<XrCompositionLayerBaseHeader *> layers;
XrSpace space;
@@ -303,7 +313,7 @@ void GHOST_XrSessionDrawViews(GHOST_XrContext *xr_context)
refspace_info.poseInReferenceSpace.orientation = {0.0f, 0.0f, 0.0f, 1.0f};
xrCreateReferenceSpace(oxr->session, &refspace_info, &space);
- proj_layer = draw_layer(xr_context, oxr, space);
+ proj_layer = draw_layer(xr_context, oxr, space, projection_layer_views);
layers.push_back(reinterpret_cast<XrCompositionLayerBaseHeader *>(&proj_layer));
drawing_end(xr_context, &layers);
More information about the Bf-blender-cvs
mailing list