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); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs