From caac01216c71f3f6fc4d08c2b0091fedd8f68402 Mon Sep 17 00:00:00 2001 From: Lubos Date: Sun, 14 Aug 2022 11:45:52 +0200 Subject: [PATCH] OpenXR - VR renderer adjustments --- Common/VR/VRFramebuffer.cpp | 2 -- Common/VR/VRRenderer.cpp | 52 +++++++++++++++---------------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/Common/VR/VRFramebuffer.cpp b/Common/VR/VRFramebuffer.cpp index 18e49772ab..9f637a5037 100644 --- a/Common/VR/VRFramebuffer.cpp +++ b/Common/VR/VRFramebuffer.cpp @@ -103,10 +103,8 @@ bool ovrFramebuffer_Create( // Create the color buffer texture. const GLuint colorTexture = frameBuffer->ColorSwapChainImage[i].image; - GLfloat borderColor[] = {0.0f, 0.0f, 0.0f, 0.0f}; GLenum textureTarget = GL_TEXTURE_2D_ARRAY; GL(glBindTexture(textureTarget, colorTexture)); - GL(glTexParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, borderColor)); GL(glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); GL(glTexParameteri(textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); GL(glTexParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); diff --git a/Common/VR/VRRenderer.cpp b/Common/VR/VRRenderer.cpp index f772fe283e..fd01398866 100644 --- a/Common/VR/VRRenderer.cpp +++ b/Common/VR/VRRenderer.cpp @@ -305,29 +305,23 @@ void VR_BeginFrame( engine_t* engine ) { engine->appState.LayerCount = 0; memset(engine->appState.Layers, 0, sizeof(ovrCompositorLayer_Union) * ovrMaxLayerCount); - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; - - ovrFramebuffer_Acquire(frameBuffer); - ovrFramebuffer_SetCurrent(frameBuffer); - VR_ClearFrameBuffer(frameBuffer->ColorSwapChain.Width, frameBuffer->ColorSwapChain.Height); - } + ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer; + ovrFramebuffer_Acquire(frameBuffer); + ovrFramebuffer_SetCurrent(frameBuffer); + VR_ClearFrameBuffer(frameBuffer->ColorSwapChain.Width, frameBuffer->ColorSwapChain.Height); } void VR_EndFrame( engine_t* engine ) { - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { + // Clear the alpha channel, other way OpenXR would not transfer the framebuffer fully + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - // Clear the alpha channel, other way OpenXR would not transfer the framebuffer fully - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; - //TODO:ovrFramebuffer_Resolve(frameBuffer); - ovrFramebuffer_Release(frameBuffer); - } + ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer; + //TODO:ovrFramebuffer_Resolve(frameBuffer); + ovrFramebuffer_Release(frameBuffer); ovrFramebuffer_SetNone(); XrCompositionLayerProjectionView projection_layer_elements[2] = {}; @@ -336,11 +330,11 @@ void VR_EndFrame( engine_t* engine ) { menuYaw = hmdorientation.y; for (int eye = 0; eye < ovrMaxNumEyes; eye++) { + int imageLayer = eye; XrFovf fov = projections[eye].fov; - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; if (vrMode == VR_MODE_MONO_6DOF) { - frameBuffer = &engine->appState.Renderer.FrameBuffer[0]; fov = projections[0].fov; + imageLayer = 0; } memset(&projection_layer_elements[eye], 0, sizeof(XrCompositionLayerProjectionView)); @@ -354,7 +348,7 @@ void VR_EndFrame( engine_t* engine ) { projection_layer_elements[eye].subImage.imageRect.offset.y = 0; projection_layer_elements[eye].subImage.imageRect.extent.width = frameBuffer->ColorSwapChain.Width; projection_layer_elements[eye].subImage.imageRect.extent.height = frameBuffer->ColorSwapChain.Height; - projection_layer_elements[eye].subImage.imageArrayIndex = 0; + projection_layer_elements[eye].subImage.imageArrayIndex = imageLayer; } XrCompositionLayerProjection projection_layer = {}; @@ -369,15 +363,15 @@ void VR_EndFrame( engine_t* engine ) { } else if (vrMode == VR_MODE_FLAT_SCREEN) { // Build the cylinder layer - int width = engine->appState.Renderer.FrameBuffer[0].ColorSwapChain.Width; - int height = engine->appState.Renderer.FrameBuffer[0].ColorSwapChain.Height; + int width = engine->appState.Renderer.FrameBuffer.ColorSwapChain.Width; + int height = engine->appState.Renderer.FrameBuffer.ColorSwapChain.Height; XrCompositionLayerCylinderKHR cylinder_layer = {}; cylinder_layer.type = XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR; cylinder_layer.layerFlags = XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT; cylinder_layer.space = engine->appState.CurrentSpace; cylinder_layer.eyeVisibility = XR_EYE_VISIBILITY_BOTH; memset(&cylinder_layer.subImage, 0, sizeof(XrSwapchainSubImage)); - cylinder_layer.subImage.swapchain = engine->appState.Renderer.FrameBuffer[0].ColorSwapChain.Handle; + cylinder_layer.subImage.swapchain = engine->appState.Renderer.FrameBuffer.ColorSwapChain.Handle; cylinder_layer.subImage.imageRect.offset.x = 0; cylinder_layer.subImage.imageRect.offset.y = 0; cylinder_layer.subImage.imageRect.extent.width = width; @@ -414,12 +408,8 @@ void VR_EndFrame( engine_t* engine ) { endFrameInfo.layers = layers; OXR(xrEndFrame(engine->appState.Session, &endFrameInfo)); - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; - frameBuffer->TextureSwapChainIndex++; - frameBuffer->TextureSwapChainIndex %= frameBuffer->TextureSwapChainLength; - } -} + frameBuffer->TextureSwapChainIndex++; + frameBuffer->TextureSwapChainIndex %= frameBuffer->TextureSwapChainLength;} int VR_GetConfig( VRConfig config ) { return vrConfig[config]; @@ -431,7 +421,7 @@ void VR_SetConfig( VRConfig config, int value) { void VR_BindFramebuffer( engine_t* engine, int eye ) { if (!initialized) return; - ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; + ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer; int swapchainIndex = frameBuffer->TextureSwapChainIndex; int glFramebuffer = frameBuffer->FrameBuffers[swapchainIndex]; glBindFramebuffer(GL_FRAMEBUFFER, glFramebuffer);