Early work on batching stereo better

This commit is contained in:
samcake 2016-03-16 18:35:07 -07:00
parent 35aa074955
commit d05e23b278
3 changed files with 40 additions and 9 deletions

View file

@ -248,7 +248,10 @@ void GLBackend::render(Batch& batch) {
if (!batch.isStereoEnabled()) { if (!batch.isStereoEnabled()) {
_stereo._enable = false; _stereo._enable = false;
} }
_stereo._enable =batch.isStereoEnabled();
glEnable(GL_CLIP_DISTANCE0);
{ {
PROFILE_RANGE("Transfer"); PROFILE_RANGE("Transfer");
renderPassTransfer(batch); renderPassTransfer(batch);
@ -259,13 +262,15 @@ void GLBackend::render(Batch& batch) {
renderPassDraw(batch); renderPassDraw(batch);
} }
if (_stereo._enable) { /* if (_stereo._enable) {
PROFILE_RANGE("RightRender"); PROFILE_RANGE("RightRender");
_stereo._pass = 1; _stereo._pass = 1;
renderPassDraw(batch); renderPassDraw(batch);
_stereo._pass = 0; _stereo._pass = 0;
} }*/
glDisable(GL_CLIP_DISTANCE0);
// Restore the saved stereo state for the next batch // Restore the saved stereo state for the next batch
_stereo._enable = savedStereo; _stereo._enable = savedStereo;
} }
@ -326,7 +331,12 @@ void GLBackend::do_draw(Batch& batch, size_t paramOffset) {
GLenum mode = _primitiveToGLmode[primitiveType]; GLenum mode = _primitiveToGLmode[primitiveType];
uint32 numVertices = batch._params[paramOffset + 1]._uint; uint32 numVertices = batch._params[paramOffset + 1]._uint;
uint32 startVertex = batch._params[paramOffset + 0]._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(); (void) CHECK_GL_ERROR();
} }
@ -341,7 +351,11 @@ void GLBackend::do_drawIndexed(Batch& batch, size_t paramOffset) {
auto typeByteSize = TYPE_SIZE[_input._indexBufferType]; auto typeByteSize = TYPE_SIZE[_input._indexBufferType];
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset); GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(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(); (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 numVertices = batch._params[paramOffset + 2]._uint;
uint32 startVertex = batch._params[paramOffset + 1]._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(); (void) CHECK_GL_ERROR();
} }
@ -370,9 +384,9 @@ void GLBackend::do_drawIndexedInstanced(Batch& batch, size_t paramOffset) {
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset); GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
#if (GPU_INPUT_PROFILE == GPU_CORE_43) #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 #else
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, numInstances); glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, (isStereo() ? 2 * numInstances : numInstances));
Q_UNUSED(startInstance); Q_UNUSED(startInstance);
#endif #endif
(void)CHECK_GL_ERROR(); (void)CHECK_GL_ERROR();

View file

@ -32,6 +32,7 @@ void GLBackend::do_setViewportTransform(Batch& batch, size_t paramOffset) {
memcpy(&_transform._viewport, batch.editData(batch._params[paramOffset]._uint), sizeof(Vec4i)); memcpy(&_transform._viewport, batch.editData(batch._params[paramOffset]._uint), sizeof(Vec4i));
ivec4& vp = _transform._viewport; ivec4& vp = _transform._viewport;
glViewport(vp.x, vp.y, vp.z, vp.w);
// Where we assign the GL viewport // Where we assign the GL viewport
if (_stereo._enable) { 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 // The Viewport is tagged invalid because the CameraTransformUBO is not up to date and will need update on next drawcall
_transform._invalidViewport = true; _transform._invalidViewport = true;
@ -213,7 +214,7 @@ void GLBackend::updateTransform(const Batch& batch) {
glBindBuffer(GL_ARRAY_BUFFER, _transform._drawCallInfoBuffer); glBindBuffer(GL_ARRAY_BUFFER, _transform._drawCallInfoBuffer);
glVertexAttribIPointer(gpu::Stream::DRAW_CALL_INFO, 2, GL_UNSIGNED_SHORT, 0, glVertexAttribIPointer(gpu::Stream::DRAW_CALL_INFO, 2, GL_UNSIGNED_SHORT, 0,
_transform._drawCallInfoOffsets[batch._currentNamedCall]); _transform._drawCallInfoOffsets[batch._currentNamedCall]);
glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, 1); glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, (isStereo() ? 2: 1));
} }
(void)CHECK_GL_ERROR(); (void)CHECK_GL_ERROR();

View file

@ -76,6 +76,18 @@ TransformObject getTransformObject() {
<$viewport$> = <$cameraTransform$>._viewport; <$viewport$> = <$cameraTransform$>._viewport;
<@endfunc@> <@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)@> <@func transformModelToEyeWorldAlignedPos(cameraTransform, objectTransform, modelPos, eyeWorldAlignedPos)@>
<!// Bring the model pos in the world aligned space centered on the eye axis !> <!// Bring the model pos in the world aligned space centered on the eye axis !>
{ // _transformModelToEyeWorldAlignedPos { // _transformModelToEyeWorldAlignedPos
@ -92,6 +104,8 @@ TransformObject getTransformObject() {
<$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$> <$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$>
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos; <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos;
<$transformStereoClipsSpace($cameraTransform$, $clipPos$)$>
} }
<@endfunc@> <@endfunc@>
@ -101,6 +115,8 @@ TransformObject getTransformObject() {
<$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$> <$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$>
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos; <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos;
<$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0); <$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0);
<$transformStereoClipsSpace($cameraTransform$, $clipPos$)$>
} }
<@endfunc@> <@endfunc@>