OpenXR - Disable multiview for now

This commit is contained in:
Lubos 2022-08-16 21:32:11 +02:00
parent 71df50a354
commit 22e7f87e33
6 changed files with 58 additions and 10 deletions

View file

@ -279,7 +279,7 @@ void GLQueueRunner::RunInitSteps(const std::vector<GLRInitStep> &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);
if (viewMatrices) {
memcpy(viewMatrices, c.uniformMatrix4.m, size);
}
glUnmapBuffer(GL_UNIFORM_BUFFER);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

View file

@ -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(

View file

@ -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];

View file

@ -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

View file

@ -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

View file

@ -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);