diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 479ab91f97..a3ccb834d4 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -279,7 +279,7 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski for (size_t j = 0; j < program->queries_.size(); j++) { auto &query = program->queries_[j]; _dbg_assert_(query.name); -#ifdef OPENXR +#ifdef OPENXR_MULTIVIEW int location = -1; int index = GetStereoBufferIndex(query.name); if (index >= 0) { @@ -1040,11 +1040,13 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last } if (loc >= 0) { int size = 2 * 16 * sizeof(float); - GLuint layout = GetStereoBufferIndex(c.uniformMatrix4.name); + int layout = GetStereoBufferIndex(c.uniformMatrix4.name); glBindBufferBase(GL_UNIFORM_BUFFER, layout, loc); glBindBuffer(GL_UNIFORM_BUFFER, loc); void *viewMatrices = glMapBufferRange(GL_UNIFORM_BUFFER, 0, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - memcpy(viewMatrices, c.uniformMatrix4.m, size); + if (viewMatrices) { + memcpy(viewMatrices, c.uniformMatrix4.m, size); + } glUnmapBuffer(GL_UNIFORM_BUFFER); glBindBuffer(GL_UNIFORM_BUFFER, 0); } diff --git a/Common/VR/VRFramebuffer.cpp b/Common/VR/VRFramebuffer.cpp index 0154bbaca7..cbf89e7f9e 100644 --- a/Common/VR/VRFramebuffer.cpp +++ b/Common/VR/VRFramebuffer.cpp @@ -70,8 +70,12 @@ bool ovrFramebuffer_Create( swapChainCreateInfo.width = width; swapChainCreateInfo.height = height; swapChainCreateInfo.faceCount = 1; - swapChainCreateInfo.arraySize = 2; swapChainCreateInfo.mipCount = 1; +#ifdef OPENXR_MULTIVIEW + swapChainCreateInfo.arraySize = 2; +#else + swapChainCreateInfo.arraySize = 1; +#endif frameBuffer->ColorSwapChain.Width = swapChainCreateInfo.width; frameBuffer->ColorSwapChain.Height = swapChainCreateInfo.height; @@ -98,6 +102,7 @@ bool ovrFramebuffer_Create( frameBuffer->FrameBuffers = (GLuint*)malloc(frameBuffer->TextureSwapChainLength * sizeof(GLuint)); for (uint32_t i = 0; i < frameBuffer->TextureSwapChainLength; i++) { +#ifdef OPENXR_MULTIVIEW // Create the color buffer texture. const GLuint colorTexture = frameBuffer->ColorSwapChainImage[i].image; @@ -126,6 +131,35 @@ bool ovrFramebuffer_Create( ALOGE("Incomplete frame buffer object: %d", renderFramebufferStatus); return false; } +#else + // Create the color buffer texture. + const GLuint colorTexture = frameBuffer->ColorSwapChainImage[i].image; + GLenum colorTextureTarget = GL_TEXTURE_2D; + GL(glBindTexture(colorTextureTarget, colorTexture)); + GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL(glTexParameteri(colorTextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL(glBindTexture(colorTextureTarget, 0)); + + // Create depth buffer. + GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i])); + GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i])); + GL(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height)); + GL(glBindRenderbuffer(GL_RENDERBUFFER, 0)); + + // Create the frame buffer. + GL(glGenFramebuffers(1, &frameBuffer->FrameBuffers[i])); + GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer->FrameBuffers[i])); + GL(glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, frameBuffer->DepthBuffers[i])); + GL(glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0)); + GL(GLenum renderFramebufferStatus = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER)); + GL(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)); + if (renderFramebufferStatus != GL_FRAMEBUFFER_COMPLETE) { + ALOGE("Incomplete frame buffer object: %d", renderFramebufferStatus); + return false; + } +#endif } return true; @@ -170,7 +204,7 @@ void ovrFramebuffer_Acquire(ovrFramebuffer* frameBuffer) { waitInfo.timeout = 1000; /* timeout in nanoseconds */ XrResult res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo); int i = 0; - while (res != XR_SUCCESS) { + while ((res != XR_SUCCESS) && (i < 10)) { res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo); i++; ALOGV( diff --git a/Common/VR/VRRenderer.cpp b/Common/VR/VRRenderer.cpp index cb6cf3c24a..d7f6ecb0dc 100644 --- a/Common/VR/VRRenderer.cpp +++ b/Common/VR/VRRenderer.cpp @@ -328,7 +328,7 @@ void VR_EndFrame( engine_t* engine ) { ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer; //TODO:ovrFramebuffer_Resolve(frameBuffer); ovrFramebuffer_Release(frameBuffer); - ovrFramebuffer_SetNone(); + //TODO:ovrFramebuffer_SetNone(); XrCompositionLayerProjectionView projection_layer_elements[2] = {}; int vrMode = vrConfig[VR_CONFIG_MODE]; diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index a360c7fa8f..6adddab052 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -151,7 +151,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag gl_exts.push_back("#extension GL_ARB_cull_distance : enable"); } } -#ifdef OPENXR +#ifdef OPENXR_MULTIVIEW gl_exts.push_back("#extension GL_OVR_multiview2 : enable\nlayout(num_views=2) in;"); #endif ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts.data(), gl_exts.size()); @@ -472,7 +472,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "uniform mat4 u_proj_through;\n"); *uniformMask |= DIRTY_PROJTHROUGHMATRIX; } else if (useHWTransform) { -#ifdef OPENXR +#ifdef OPENXR_MULTIVIEW WRITE(p, "layout(shared) uniform ProjectionMatrix { uniform mat4 u_proj; };\n"); #else WRITE(p, "uniform mat4 u_proj;\n"); @@ -484,7 +484,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag // When transforming by hardware, we need a great deal more uniforms... // TODO: Use 4x3 matrices where possible. Though probably doesn't matter much. WRITE(p, "uniform mat4 u_world;\n"); -#ifdef OPENXR +#ifdef OPENXR_MULTIVIEW WRITE(p, "layout(shared) uniform ViewMatrices { uniform mat4 u_view; };\n"); #else WRITE(p, "uniform mat4 u_view;\n"); @@ -912,7 +912,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag } std::string matrixPostfix; -#ifdef OPENXR +#ifdef OPENXR_MULTIVIEW matrixPostfix = "[gl_ViewID_OVR]"; #endif diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 084c521956..a9b5562c7c 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -421,7 +421,11 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu ScaleProjMatrix(leftEyeMatrix, useBufferedRendering); ScaleProjMatrix(rightEyeMatrix, useBufferedRendering); + #ifdef OPENXR_MULTIVIEW render_->SetUniformM4x4Stereo(&u_proj, leftEyeMatrix.m, rightEyeMatrix.m); + #else + render_->SetUniformM4x4(&u_proj, leftEyeMatrix.m); + #endif #else Matrix4x4 flippedMatrix; memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float)); @@ -545,7 +549,11 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu VR_TweakView(leftEyeView, gstate.projMatrix, VR_VIEW_MATRIX_LEFT_EYE); VR_TweakView(rightEyeView, gstate.projMatrix, VR_VIEW_MATRIX_RIGHT_EYE); } + #ifdef OPENXR_MULTIVIEW render_->SetUniformM4x4Stereo(&u_view, leftEyeView, rightEyeView); + #else + render_->SetUniformM4x4(&u_view, leftEyeView); + #endif #else SetMatrix4x3(render_, &u_view, gstate.viewMatrix); #endif diff --git a/android/jni/AndroidEGLContext.cpp b/android/jni/AndroidEGLContext.cpp index 2c7f5b1093..937ce727b9 100644 --- a/android/jni/AndroidEGLContext.cpp +++ b/android/jni/AndroidEGLContext.cpp @@ -46,7 +46,11 @@ bool AndroidEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int des } gl->MakeCurrent(); if (gl->GetMode() == GLInterfaceMode::MODE_OPENGL) +#ifdef OPENXR + SetGLCoreContext(false); +#else SetGLCoreContext(true); +#endif CheckGLExtensions(); draw_ = Draw::T3DCreateGLContext(); SetGPUBackend(GPUBackend::OPENGL);