mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
OpenXR - Disable multiview for now
This commit is contained in:
parent
71df50a354
commit
22e7f87e33
6 changed files with 58 additions and 10 deletions
|
@ -279,7 +279,7 @@ void GLQueueRunner::RunInitSteps(const std::vector<GLRInitStep> &steps, bool ski
|
||||||
for (size_t j = 0; j < program->queries_.size(); j++) {
|
for (size_t j = 0; j < program->queries_.size(); j++) {
|
||||||
auto &query = program->queries_[j];
|
auto &query = program->queries_[j];
|
||||||
_dbg_assert_(query.name);
|
_dbg_assert_(query.name);
|
||||||
#ifdef OPENXR
|
#ifdef OPENXR_MULTIVIEW
|
||||||
int location = -1;
|
int location = -1;
|
||||||
int index = GetStereoBufferIndex(query.name);
|
int index = GetStereoBufferIndex(query.name);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
|
@ -1040,11 +1040,13 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last
|
||||||
}
|
}
|
||||||
if (loc >= 0) {
|
if (loc >= 0) {
|
||||||
int size = 2 * 16 * sizeof(float);
|
int size = 2 * 16 * sizeof(float);
|
||||||
GLuint layout = GetStereoBufferIndex(c.uniformMatrix4.name);
|
int layout = GetStereoBufferIndex(c.uniformMatrix4.name);
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, layout, loc);
|
glBindBufferBase(GL_UNIFORM_BUFFER, layout, loc);
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, loc);
|
glBindBuffer(GL_UNIFORM_BUFFER, loc);
|
||||||
void *viewMatrices = glMapBufferRange(GL_UNIFORM_BUFFER, 0, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
|
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);
|
memcpy(viewMatrices, c.uniformMatrix4.m, size);
|
||||||
|
}
|
||||||
glUnmapBuffer(GL_UNIFORM_BUFFER);
|
glUnmapBuffer(GL_UNIFORM_BUFFER);
|
||||||
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,8 +70,12 @@ bool ovrFramebuffer_Create(
|
||||||
swapChainCreateInfo.width = width;
|
swapChainCreateInfo.width = width;
|
||||||
swapChainCreateInfo.height = height;
|
swapChainCreateInfo.height = height;
|
||||||
swapChainCreateInfo.faceCount = 1;
|
swapChainCreateInfo.faceCount = 1;
|
||||||
swapChainCreateInfo.arraySize = 2;
|
|
||||||
swapChainCreateInfo.mipCount = 1;
|
swapChainCreateInfo.mipCount = 1;
|
||||||
|
#ifdef OPENXR_MULTIVIEW
|
||||||
|
swapChainCreateInfo.arraySize = 2;
|
||||||
|
#else
|
||||||
|
swapChainCreateInfo.arraySize = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
frameBuffer->ColorSwapChain.Width = swapChainCreateInfo.width;
|
frameBuffer->ColorSwapChain.Width = swapChainCreateInfo.width;
|
||||||
frameBuffer->ColorSwapChain.Height = swapChainCreateInfo.height;
|
frameBuffer->ColorSwapChain.Height = swapChainCreateInfo.height;
|
||||||
|
@ -98,6 +102,7 @@ bool ovrFramebuffer_Create(
|
||||||
frameBuffer->FrameBuffers = (GLuint*)malloc(frameBuffer->TextureSwapChainLength * sizeof(GLuint));
|
frameBuffer->FrameBuffers = (GLuint*)malloc(frameBuffer->TextureSwapChainLength * sizeof(GLuint));
|
||||||
|
|
||||||
for (uint32_t i = 0; i < frameBuffer->TextureSwapChainLength; i++) {
|
for (uint32_t i = 0; i < frameBuffer->TextureSwapChainLength; i++) {
|
||||||
|
#ifdef OPENXR_MULTIVIEW
|
||||||
// Create the color buffer texture.
|
// Create the color buffer texture.
|
||||||
const GLuint colorTexture = frameBuffer->ColorSwapChainImage[i].image;
|
const GLuint colorTexture = frameBuffer->ColorSwapChainImage[i].image;
|
||||||
|
|
||||||
|
@ -126,6 +131,35 @@ bool ovrFramebuffer_Create(
|
||||||
ALOGE("Incomplete frame buffer object: %d", renderFramebufferStatus);
|
ALOGE("Incomplete frame buffer object: %d", renderFramebufferStatus);
|
||||||
return false;
|
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;
|
return true;
|
||||||
|
@ -170,7 +204,7 @@ void ovrFramebuffer_Acquire(ovrFramebuffer* frameBuffer) {
|
||||||
waitInfo.timeout = 1000; /* timeout in nanoseconds */
|
waitInfo.timeout = 1000; /* timeout in nanoseconds */
|
||||||
XrResult res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo);
|
XrResult res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (res != XR_SUCCESS) {
|
while ((res != XR_SUCCESS) && (i < 10)) {
|
||||||
res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo);
|
res = xrWaitSwapchainImage(frameBuffer->ColorSwapChain.Handle, &waitInfo);
|
||||||
i++;
|
i++;
|
||||||
ALOGV(
|
ALOGV(
|
||||||
|
|
|
@ -328,7 +328,7 @@ void VR_EndFrame( engine_t* engine ) {
|
||||||
ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer;
|
ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer;
|
||||||
//TODO:ovrFramebuffer_Resolve(frameBuffer);
|
//TODO:ovrFramebuffer_Resolve(frameBuffer);
|
||||||
ovrFramebuffer_Release(frameBuffer);
|
ovrFramebuffer_Release(frameBuffer);
|
||||||
ovrFramebuffer_SetNone();
|
//TODO:ovrFramebuffer_SetNone();
|
||||||
|
|
||||||
XrCompositionLayerProjectionView projection_layer_elements[2] = {};
|
XrCompositionLayerProjectionView projection_layer_elements[2] = {};
|
||||||
int vrMode = vrConfig[VR_CONFIG_MODE];
|
int vrMode = vrConfig[VR_CONFIG_MODE];
|
||||||
|
|
|
@ -151,7 +151,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||||
gl_exts.push_back("#extension GL_ARB_cull_distance : enable");
|
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;");
|
gl_exts.push_back("#extension GL_OVR_multiview2 : enable\nlayout(num_views=2) in;");
|
||||||
#endif
|
#endif
|
||||||
ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts.data(), gl_exts.size());
|
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");
|
WRITE(p, "uniform mat4 u_proj_through;\n");
|
||||||
*uniformMask |= DIRTY_PROJTHROUGHMATRIX;
|
*uniformMask |= DIRTY_PROJTHROUGHMATRIX;
|
||||||
} else if (useHWTransform) {
|
} else if (useHWTransform) {
|
||||||
#ifdef OPENXR
|
#ifdef OPENXR_MULTIVIEW
|
||||||
WRITE(p, "layout(shared) uniform ProjectionMatrix { uniform mat4 u_proj; };\n");
|
WRITE(p, "layout(shared) uniform ProjectionMatrix { uniform mat4 u_proj; };\n");
|
||||||
#else
|
#else
|
||||||
WRITE(p, "uniform mat4 u_proj;\n");
|
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...
|
// When transforming by hardware, we need a great deal more uniforms...
|
||||||
// TODO: Use 4x3 matrices where possible. Though probably doesn't matter much.
|
// TODO: Use 4x3 matrices where possible. Though probably doesn't matter much.
|
||||||
WRITE(p, "uniform mat4 u_world;\n");
|
WRITE(p, "uniform mat4 u_world;\n");
|
||||||
#ifdef OPENXR
|
#ifdef OPENXR_MULTIVIEW
|
||||||
WRITE(p, "layout(shared) uniform ViewMatrices { uniform mat4 u_view; };\n");
|
WRITE(p, "layout(shared) uniform ViewMatrices { uniform mat4 u_view; };\n");
|
||||||
#else
|
#else
|
||||||
WRITE(p, "uniform mat4 u_view;\n");
|
WRITE(p, "uniform mat4 u_view;\n");
|
||||||
|
@ -912,7 +912,7 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string matrixPostfix;
|
std::string matrixPostfix;
|
||||||
#ifdef OPENXR
|
#ifdef OPENXR_MULTIVIEW
|
||||||
matrixPostfix = "[gl_ViewID_OVR]";
|
matrixPostfix = "[gl_ViewID_OVR]";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -421,7 +421,11 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu
|
||||||
ScaleProjMatrix(leftEyeMatrix, useBufferedRendering);
|
ScaleProjMatrix(leftEyeMatrix, useBufferedRendering);
|
||||||
ScaleProjMatrix(rightEyeMatrix, useBufferedRendering);
|
ScaleProjMatrix(rightEyeMatrix, useBufferedRendering);
|
||||||
|
|
||||||
|
#ifdef OPENXR_MULTIVIEW
|
||||||
render_->SetUniformM4x4Stereo(&u_proj, leftEyeMatrix.m, rightEyeMatrix.m);
|
render_->SetUniformM4x4Stereo(&u_proj, leftEyeMatrix.m, rightEyeMatrix.m);
|
||||||
|
#else
|
||||||
|
render_->SetUniformM4x4(&u_proj, leftEyeMatrix.m);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
Matrix4x4 flippedMatrix;
|
Matrix4x4 flippedMatrix;
|
||||||
memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float));
|
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(leftEyeView, gstate.projMatrix, VR_VIEW_MATRIX_LEFT_EYE);
|
||||||
VR_TweakView(rightEyeView, gstate.projMatrix, VR_VIEW_MATRIX_RIGHT_EYE);
|
VR_TweakView(rightEyeView, gstate.projMatrix, VR_VIEW_MATRIX_RIGHT_EYE);
|
||||||
}
|
}
|
||||||
|
#ifdef OPENXR_MULTIVIEW
|
||||||
render_->SetUniformM4x4Stereo(&u_view, leftEyeView, rightEyeView);
|
render_->SetUniformM4x4Stereo(&u_view, leftEyeView, rightEyeView);
|
||||||
|
#else
|
||||||
|
render_->SetUniformM4x4(&u_view, leftEyeView);
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
SetMatrix4x3(render_, &u_view, gstate.viewMatrix);
|
SetMatrix4x3(render_, &u_view, gstate.viewMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,7 +46,11 @@ bool AndroidEGLGraphicsContext::InitFromRenderThread(ANativeWindow *wnd, int des
|
||||||
}
|
}
|
||||||
gl->MakeCurrent();
|
gl->MakeCurrent();
|
||||||
if (gl->GetMode() == GLInterfaceMode::MODE_OPENGL)
|
if (gl->GetMode() == GLInterfaceMode::MODE_OPENGL)
|
||||||
|
#ifdef OPENXR
|
||||||
|
SetGLCoreContext(false);
|
||||||
|
#else
|
||||||
SetGLCoreContext(true);
|
SetGLCoreContext(true);
|
||||||
|
#endif
|
||||||
CheckGLExtensions();
|
CheckGLExtensions();
|
||||||
draw_ = Draw::T3DCreateGLContext();
|
draw_ = Draw::T3DCreateGLContext();
|
||||||
SetGPUBackend(GPUBackend::OPENGL);
|
SetGPUBackend(GPUBackend::OPENGL);
|
||||||
|
|
Loading…
Add table
Reference in a new issue