diff --git a/Common/VR/VRFramebuffer.cpp b/Common/VR/VRFramebuffer.cpp index be535e606c..18e49772ab 100644 --- a/Common/VR/VRFramebuffer.cpp +++ b/Common/VR/VRFramebuffer.cpp @@ -16,6 +16,14 @@ double FromXrTime(const XrTime time) { return (time * 1e-9); } +typedef void(GL_APIENTRY* PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)( + GLenum target, + GLenum attachment, + GLuint texture, + GLint level, + GLint baseViewIndex, + GLsizei numViews); + /* ================================================================================ @@ -24,6 +32,7 @@ ovrFramebuffer ================================================================================ */ + void ovrFramebuffer_Clear(ovrFramebuffer* frameBuffer) { frameBuffer->Width = 0; frameBuffer->Height = 0; @@ -46,6 +55,10 @@ bool ovrFramebuffer_Create( frameBuffer->Width = width; frameBuffer->Height = height; + PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR = + (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)eglGetProcAddress( + "glFramebufferTextureMultiviewOVR"); + XrSwapchainCreateInfo swapChainCreateInfo; memset(&swapChainCreateInfo, 0, sizeof(swapChainCreateInfo)); swapChainCreateInfo.type = XR_TYPE_SWAPCHAIN_CREATE_INFO; @@ -55,7 +68,7 @@ bool ovrFramebuffer_Create( swapChainCreateInfo.width = width; swapChainCreateInfo.height = height; swapChainCreateInfo.faceCount = 1; - swapChainCreateInfo.arraySize = 1; + swapChainCreateInfo.arraySize = 2; swapChainCreateInfo.mipCount = 1; frameBuffer->ColorSwapChain.Width = swapChainCreateInfo.width; @@ -89,31 +102,32 @@ bool ovrFramebuffer_Create( for (uint32_t i = 0; i < frameBuffer->TextureSwapChainLength; i++) { // 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)); + + 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)); + GL(glTexParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL(glBindTexture(textureTarget, 0)); // Create depth buffer. - GL(glGenRenderbuffers(1, &frameBuffer->DepthBuffers[i])); - GL(glBindRenderbuffer(GL_RENDERBUFFER, frameBuffer->DepthBuffers[i])); - GL(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height)); - GL(glBindRenderbuffer(GL_RENDERBUFFER, 0)); + GL(glGenTextures(1, &frameBuffer->DepthBuffers[i])); + GL(glBindTexture(textureTarget, frameBuffer->DepthBuffers[i])); + GL(glTexStorage3D(textureTarget, 1, GL_DEPTH_COMPONENT24, width, height, 2)); + GL(glBindTexture(textureTarget, 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_STENCIL_ATTACHMENT, GL_RENDERBUFFER, frameBuffer->DepthBuffers[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(glFramebufferTextureMultiviewOVR(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, frameBuffer->DepthBuffers[i], 0, 0, 2)); + GL(glFramebufferTextureMultiviewOVR(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, colorTexture, 0, 0, 2)); 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); + ALOGE("Incomplete frame buffer object: %d", renderFramebufferStatus); return false; } } @@ -184,9 +198,7 @@ ovrRenderer */ void ovrRenderer_Clear(ovrRenderer* renderer) { - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { - ovrFramebuffer_Clear(&renderer->FrameBuffer[eye]); - } + ovrFramebuffer_Clear(&renderer->FrameBuffer); } void ovrRenderer_Create( @@ -195,19 +207,15 @@ void ovrRenderer_Create( int suggestedEyeTextureWidth, int suggestedEyeTextureHeight) { // Create the frame buffers. - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { - ovrFramebuffer_Create( - session, - &renderer->FrameBuffer[eye], - suggestedEyeTextureWidth, - suggestedEyeTextureHeight); - } + ovrFramebuffer_Create( + session, + &renderer->FrameBuffer, + suggestedEyeTextureWidth, + suggestedEyeTextureHeight); } void ovrRenderer_Destroy(ovrRenderer* renderer) { - for (int eye = 0; eye < ovrMaxNumEyes; eye++) { - ovrFramebuffer_Destroy(&renderer->FrameBuffer[eye]); - } + ovrFramebuffer_Destroy(&renderer->FrameBuffer); } /* @@ -235,7 +243,6 @@ void ovrApp_Clear(ovrApp* app) { app->LayerCount = 0; app->MainThreadTid = 0; app->RenderThreadTid = 0; - app->TouchPadDownLastFrame = false; ovrRenderer_Clear(&app->Renderer); } diff --git a/Common/VR/VRFramebuffer.h b/Common/VR/VRFramebuffer.h index 90e14a2030..ae4344009b 100644 --- a/Common/VR/VRFramebuffer.h +++ b/Common/VR/VRFramebuffer.h @@ -50,7 +50,7 @@ typedef struct { } ovrFramebuffer; typedef struct { - ovrFramebuffer FrameBuffer[ovrMaxNumEyes]; + ovrFramebuffer FrameBuffer; } ovrRenderer; typedef struct { @@ -74,7 +74,6 @@ typedef struct { ovrCompositorLayer_Union Layers[ovrMaxLayerCount]; int LayerCount; - int TouchPadDownLastFrame; ovrRenderer Renderer; } ovrApp;