From d05e23b2787b0b6636d418de0bb7da96c55c6621 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 16 Mar 2016 18:35:07 -0700 Subject: [PATCH] Early work on batching stereo better --- libraries/gpu/src/gpu/GLBackend.cpp | 28 +++++++++++++++----- libraries/gpu/src/gpu/GLBackendTransform.cpp | 5 ++-- libraries/gpu/src/gpu/Transform.slh | 16 +++++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp index 14e4397b83..6fedf66af1 100644 --- a/libraries/gpu/src/gpu/GLBackend.cpp +++ b/libraries/gpu/src/gpu/GLBackend.cpp @@ -248,7 +248,10 @@ void GLBackend::render(Batch& batch) { if (!batch.isStereoEnabled()) { _stereo._enable = false; } + _stereo._enable =batch.isStereoEnabled(); + glEnable(GL_CLIP_DISTANCE0); + { PROFILE_RANGE("Transfer"); renderPassTransfer(batch); @@ -259,13 +262,15 @@ void GLBackend::render(Batch& batch) { renderPassDraw(batch); } - if (_stereo._enable) { + /* if (_stereo._enable) { PROFILE_RANGE("RightRender"); _stereo._pass = 1; renderPassDraw(batch); _stereo._pass = 0; - } + }*/ + glDisable(GL_CLIP_DISTANCE0); + // Restore the saved stereo state for the next batch _stereo._enable = savedStereo; } @@ -326,7 +331,12 @@ void GLBackend::do_draw(Batch& batch, size_t paramOffset) { GLenum mode = _primitiveToGLmode[primitiveType]; uint32 numVertices = batch._params[paramOffset + 1]._uint; uint32 startVertex = batch._params[paramOffset + 0]._uint; - glDrawArrays(mode, startVertex, numVertices); + if (isStereo()) { + glDrawArraysInstanced(mode, startVertex, numVertices, 2); + } else { + glDrawArrays(mode, startVertex, numVertices); + } + (void) CHECK_GL_ERROR(); } @@ -341,7 +351,11 @@ void GLBackend::do_drawIndexed(Batch& batch, size_t paramOffset) { auto typeByteSize = TYPE_SIZE[_input._indexBufferType]; GLvoid* indexBufferByteOffset = reinterpret_cast(startIndex * typeByteSize + _input._indexBufferOffset); - glDrawElements(mode, numIndices, glType, indexBufferByteOffset); + if (isStereo()) { + glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, 2); + } else { + glDrawElements(mode, numIndices, glType, indexBufferByteOffset); + } (void) CHECK_GL_ERROR(); } @@ -352,7 +366,7 @@ void GLBackend::do_drawInstanced(Batch& batch, size_t paramOffset) { uint32 numVertices = batch._params[paramOffset + 2]._uint; uint32 startVertex = batch._params[paramOffset + 1]._uint; - glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances); + glDrawArraysInstancedARB(mode, startVertex, numVertices, (isStereo() ? 2 * numInstances : numInstances)); (void) CHECK_GL_ERROR(); } @@ -370,9 +384,9 @@ void GLBackend::do_drawIndexedInstanced(Batch& batch, size_t paramOffset) { GLvoid* indexBufferByteOffset = reinterpret_cast(startIndex * typeByteSize + _input._indexBufferOffset); #if (GPU_INPUT_PROFILE == GPU_CORE_43) - glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance); + glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, (isStereo() ? 2 * numInstances : numInstances), 0, startInstance); #else - glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, numInstances); + glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, (isStereo() ? 2 * numInstances : numInstances)); Q_UNUSED(startInstance); #endif (void)CHECK_GL_ERROR(); diff --git a/libraries/gpu/src/gpu/GLBackendTransform.cpp b/libraries/gpu/src/gpu/GLBackendTransform.cpp index 19cb7fb2a9..2bef3c606e 100755 --- a/libraries/gpu/src/gpu/GLBackendTransform.cpp +++ b/libraries/gpu/src/gpu/GLBackendTransform.cpp @@ -32,6 +32,7 @@ void GLBackend::do_setViewportTransform(Batch& batch, size_t paramOffset) { memcpy(&_transform._viewport, batch.editData(batch._params[paramOffset]._uint), sizeof(Vec4i)); ivec4& vp = _transform._viewport; + glViewport(vp.x, vp.y, vp.z, vp.w); // Where we assign the GL viewport if (_stereo._enable) { @@ -41,7 +42,7 @@ void GLBackend::do_setViewportTransform(Batch& batch, size_t paramOffset) { } } - glViewport(vp.x, vp.y, vp.z, vp.w); +// glViewport(vp.x, vp.y, vp.z, vp.w); // The Viewport is tagged invalid because the CameraTransformUBO is not up to date and will need update on next drawcall _transform._invalidViewport = true; @@ -213,7 +214,7 @@ void GLBackend::updateTransform(const Batch& batch) { glBindBuffer(GL_ARRAY_BUFFER, _transform._drawCallInfoBuffer); glVertexAttribIPointer(gpu::Stream::DRAW_CALL_INFO, 2, GL_UNSIGNED_SHORT, 0, _transform._drawCallInfoOffsets[batch._currentNamedCall]); - glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, 1); + glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, (isStereo() ? 2: 1)); } (void)CHECK_GL_ERROR(); diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index 52ddf92158..7a1af8d655 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -76,6 +76,18 @@ TransformObject getTransformObject() { <$viewport$> = <$cameraTransform$>._viewport; <@endfunc@> +<@func transformStereoClipsSpace(cameraTransform, clipPos)@> + { + vec4 eyeClipEdge[2]= vec4[2](vec4(-1,0,0,1), vec4(1,0,0,1)); + vec2 eyeOffsetScale = vec2(-0.5, +0.5); + uint eyeIndex = gl_InstanceID % 2; + gl_ClipDistance[0] = dot(<$clipPos$>, eyeClipEdge[eyeIndex]); + float newClipPosX = <$clipPos$>.x * 0.5 + eyeOffsetScale[eyeIndex] * <$clipPos$>.w; + <$clipPos$>.x = newClipPosX; + } +<@endfunc@> + + <@func transformModelToEyeWorldAlignedPos(cameraTransform, objectTransform, modelPos, eyeWorldAlignedPos)@> { // _transformModelToEyeWorldAlignedPos @@ -92,6 +104,8 @@ TransformObject getTransformObject() { <$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$> <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos; + + <$transformStereoClipsSpace($cameraTransform$, $clipPos$)$> } <@endfunc@> @@ -101,6 +115,8 @@ TransformObject getTransformObject() { <$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$> <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos; <$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0); + + <$transformStereoClipsSpace($cameraTransform$, $clipPos$)$> } <@endfunc@>