History

more work on batch optimzation

Brad Hefta-Gaub committed 11 years ago

Commit 85b23221 parent b2bbaf413 files · +142 −116Browse files

Showing the changes to interface/src/Application.cpp (1 of 13 files). Show all

Unified · Split

interface/src/Application.cpp+89−74
@@ -1037,6 +1037,8 @@ void Application::initializeUi() { · 1036 unmodified lines
1037 1037
1038void Application::paintGL() {1038void Application::paintGL() {
1039 PROFILE_RANGE(__FUNCTION__);1039 PROFILE_RANGE(__FUNCTION__);
1040 PerformanceTimer perfTimer("paintGL");
1041
1040 if (nullptr == _displayPlugin) {1042 if (nullptr == _displayPlugin) {
1041 return;1043 return;
1042 }1044 }
@@ -1063,18 +1065,19 @@ void Application::paintGL() { · 20 unmodified lines
1063 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,1065 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,
1064 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);1066 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
1065 1067
1066 PerformanceTimer perfTimer("paintGL");
1067
1068
1069 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));1068 PerformanceWarning::setSuppressShortTimings(Menu::getInstance()->isOptionChecked(MenuOption::SuppressShortTimings));
1070 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);1069 bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings);
1071 PerformanceWarning warn(showWarnings, "Application::paintGL()");1070 PerformanceWarning warn(showWarnings, "Application::paintGL()");
1072 resizeGL();1071 resizeGL();
1073 1072
1074 // Before anything else, let's sync up the gpuContext with the true glcontext used in case anything happened1073 // Before anything else, let's sync up the gpuContext with the true glcontext used in case anything happened
1075 renderArgs._context->syncCache();1074 {
1075 PerformanceTimer perfTimer("syncCache");
1076 renderArgs._context->syncCache();
1077 }
1076 1078
1077 if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) {1079 if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) {
1080 PerformanceTimer perfTimer("Mirror");
1078 auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor();1081 auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor();
1079 1082
1080 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;1083 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
@@ -1088,7 +1091,7 @@ void Application::paintGL() { · 7 unmodified lines
1088 auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w);1091 auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w);
1089 1092
1090 auto selfieFbo = DependencyManager::get<FramebufferCache>()->getSelfieFramebuffer();1093 auto selfieFbo = DependencyManager::get<FramebufferCache>()->getSelfieFramebuffer();
1091 doInBatch(renderArgs._context, [=](gpu::Batch& batch) {1094 gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) {
1092 batch.setFramebuffer(selfieFbo);1095 batch.setFramebuffer(selfieFbo);
1093 batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));1096 batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f));
1094 batch.blit(primaryFbo, mirrorRect, selfieFbo, mirrorRectDest);1097 batch.blit(primaryFbo, mirrorRect, selfieFbo, mirrorRectDest);
@@ -1106,81 +1109,86 @@ void Application::paintGL() { · 11 unmodified lines
1106 _applicationOverlay.renderOverlay(&renderArgs);1109 _applicationOverlay.renderOverlay(&renderArgs);
1107 }1110 }
1108 1111
1109 _myAvatar->startCapture();1112 {
1110 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {1113 PerformanceTimer perfTimer("CameraUpdates");
1111 Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, _myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN);
1112 Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !(_myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN));
1113 Application::getInstance()->cameraMenuChanged();
1114 }
1115
1116 // The render mode is default or mirror if the camera is in mirror mode, assigned further below
1117 renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
1118 1114
1119 // Always use the default eye position, not the actual head eye position.1115 _myAvatar->startCapture();
1120 // Using the latter will cause the camera to wobble with idle animations,1116 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON || _myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1121 // or with changes from the face tracker1117 Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, _myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN);
1122 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {1118 Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !(_myAvatar->getBoomLength() <= MyAvatar::ZOOM_MIN));
1123 if (isHMDMode()) {1119 Application::getInstance()->cameraMenuChanged();
1124 mat4 camMat = _myAvatar->getSensorToWorldMatrix() * _myAvatar->getHMDSensorMatrix();
1125 _myCamera.setPosition(extractTranslation(camMat));
1126 _myCamera.setRotation(glm::quat_cast(camMat));
1127 } else {
1128 _myCamera.setPosition(_myAvatar->getDefaultEyePosition());
1129 _myCamera.setRotation(_myAvatar->getHead()->getCameraOrientation());
1130 }1120 }
1131 } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {1121
1132 if (isHMDMode()) {1122 // The render mode is default or mirror if the camera is in mirror mode, assigned further below
1133 glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());1123 renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
1134 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation() * hmdRotation);1124
1135 // Ignore MenuOption::CenterPlayerInView in HMD view1125 // Always use the default eye position, not the actual head eye position.
1136 glm::vec3 hmdOffset = extractTranslation(_myAvatar->getHMDSensorMatrix());1126 // Using the latter will cause the camera to wobble with idle animations,
1137 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()1127 // or with changes from the face tracker
1138 + _myAvatar->getOrientation() 1128 if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
1139 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f) + hmdOffset));1129 if (isHMDMode()) {
1140 } else {1130 mat4 camMat = _myAvatar->getSensorToWorldMatrix() * _myAvatar->getHMDSensorMatrix();
1141 _myCamera.setRotation(_myAvatar->getHead()->getOrientation());1131 _myCamera.setPosition(extractTranslation(camMat));
1142 if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {1132 _myCamera.setRotation(glm::quat_cast(camMat));
1143 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1144 + _myCamera.getRotation()
1145 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1146 } else {1133 } else {
1134 _myCamera.setPosition(_myAvatar->getDefaultEyePosition());
1135 _myCamera.setRotation(_myAvatar->getHead()->getCameraOrientation());
1136 }
1137 } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
1138 if (isHMDMode()) {
1139 glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());
1140 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation() * hmdRotation);
1141 // Ignore MenuOption::CenterPlayerInView in HMD view
1142 glm::vec3 hmdOffset = extractTranslation(_myAvatar->getHMDSensorMatrix());
1147 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()1143 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1148 + _myAvatar->getOrientation() 1144 + _myAvatar->getOrientation()
1149 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));1145 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f) + hmdOffset));
1146 } else {
1147 _myCamera.setRotation(_myAvatar->getHead()->getOrientation());
1148 if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
1149 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1150 + _myCamera.getRotation()
1151 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1152 } else {
1153 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1154 + _myAvatar->getOrientation()
1155 * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
1156 }
1150 }1157 }
1158 } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
1159 if (isHMDMode()) {
1160 glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());
1161 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation()
1162 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)) * hmdRotation);
1163 glm::vec3 hmdOffset = extractTranslation(_myAvatar->getHMDSensorMatrix());
1164 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1165 + glm::vec3(0, _raiseMirror * _myAvatar->getScale(), 0)
1166 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1167 glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
1168 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))) * hmdOffset);
1169 } else {
1170 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation()
1171 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
1172 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1173 + glm::vec3(0, _raiseMirror * _myAvatar->getScale(), 0)
1174 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1175 glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror);
1176 }
1177 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;
1151 }1178 }
1152 } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {1179 // Update camera position
1153 if (isHMDMode()) {1180 if (!isHMDMode()) {
1154 glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());1181 _myCamera.update(1.0f / _fps);
1155 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation()
1156 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)) * hmdRotation);
1157 glm::vec3 hmdOffset = extractTranslation(_myAvatar->getHMDSensorMatrix());
1158 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1159 + glm::vec3(0, _raiseMirror * _myAvatar->getScale(), 0)
1160 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1161 glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
1162 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))) * hmdOffset);
1163 } else {
1164 _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation()
1165 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
1166 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
1167 + glm::vec3(0, _raiseMirror * _myAvatar->getScale(), 0)
1168 + (_myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) *
1169 glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror);
1170 }1182 }
1171 renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE;1183 _myAvatar->endCapture();
1172 }1184 }
1173 // Update camera position
1174 if (!isHMDMode()) {
1175 _myCamera.update(1.0f / _fps);
1176 }
1177 _myAvatar->endCapture();
1178 1185
1179 // Primary rendering pass1186 // Primary rendering pass
1180 auto framebufferCache = DependencyManager::get<FramebufferCache>();1187 auto framebufferCache = DependencyManager::get<FramebufferCache>();
1181 const QSize size = framebufferCache->getFrameBufferSize();1188 const QSize size = framebufferCache->getFrameBufferSize();
1182 {1189 {
1183 PROFILE_RANGE(__FUNCTION__ "/mainRender");1190 PROFILE_RANGE(__FUNCTION__ "/mainRender");
1191 PerformanceTimer perfTimer("mainRender");
1184 // Viewport is assigned to the size of the framebuffer1192 // Viewport is assigned to the size of the framebuffer
1185 renderArgs._viewport = ivec4(0, 0, size.width(), size.height());1193 renderArgs._viewport = ivec4(0, 0, size.width(), size.height());
1186 if (displayPlugin->isStereo()) {1194 if (displayPlugin->isStereo()) {
@@ -1217,7 +1225,7 @@ void Application::paintGL() { · 30 unmodified lines
1217 }1225 }
1218 displaySide(&renderArgs, _myCamera);1226 displaySide(&renderArgs, _myCamera);
1219 renderArgs._context->enableStereo(false);1227 renderArgs._context->enableStereo(false);
1220 doInBatch(renderArgs._context, [](gpu::Batch& batch) {1228 gpu::doInBatch(renderArgs._context, [](gpu::Batch& batch) {
1221 batch.setFramebuffer(nullptr);1229 batch.setFramebuffer(nullptr);
1222 });1230 });
1223 }1231 }
@@ -1225,6 +1233,7 @@ void Application::paintGL() { · 1 unmodified line
1225 // Overlay Composition, needs to occur after screen space effects have completed1233 // Overlay Composition, needs to occur after screen space effects have completed
1226 {1234 {
1227 PROFILE_RANGE(__FUNCTION__ "/compositor");1235 PROFILE_RANGE(__FUNCTION__ "/compositor");
1236 PerformanceTimer perfTimer("compositor");
1228 auto primaryFbo = framebufferCache->getPrimaryFramebuffer();1237 auto primaryFbo = framebufferCache->getPrimaryFramebuffer();
1229 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFbo));1238 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFbo));
1230 if (displayPlugin->isStereo()) {1239 if (displayPlugin->isStereo()) {
@@ -1249,6 +1258,7 @@ void Application::paintGL() { · 18 unmodified lines
1249 // deliver final composited scene to the display plugin1258 // deliver final composited scene to the display plugin
1250 {1259 {
1251 PROFILE_RANGE(__FUNCTION__ "/pluginOutput");1260 PROFILE_RANGE(__FUNCTION__ "/pluginOutput");
1261 PerformanceTimer perfTimer("pluginOutput");
1252 auto primaryFbo = framebufferCache->getPrimaryFramebuffer();1262 auto primaryFbo = framebufferCache->getPrimaryFramebuffer();
1253 GLuint finalTexture = gpu::GLBackend::getTextureID(primaryFbo->getRenderBuffer(0));1263 GLuint finalTexture = gpu::GLBackend::getTextureID(primaryFbo->getRenderBuffer(0));
1254 // Ensure the rendering context commands are completed when rendering 1264 // Ensure the rendering context commands are completed when rendering
@@ -1266,24 +1276,29 @@ void Application::paintGL() { · 11 unmodified lines
1266 1276
1267 {1277 {
1268 PROFILE_RANGE(__FUNCTION__ "/pluginDisplay");1278 PROFILE_RANGE(__FUNCTION__ "/pluginDisplay");
1279 PerformanceTimer perfTimer("pluginDisplay");
1269 displayPlugin->display(finalTexture, toGlm(size));1280 displayPlugin->display(finalTexture, toGlm(size));
1270 }1281 }
1271 1282
1272 {1283 {
1273 PROFILE_RANGE(__FUNCTION__ "/bufferSwap");1284 PROFILE_RANGE(__FUNCTION__ "/bufferSwap");
1285 PerformanceTimer perfTimer("bufferSwap");
1274 displayPlugin->finishFrame();1286 displayPlugin->finishFrame();
1275 }1287 }
1276 }1288 }
1277 1289
1278 _offscreenContext->makeCurrent();1290 {
1279 _frameCount++;1291 PerformanceTimer perfTimer("makeCurrent");
1280 Stats::getInstance()->setRenderDetails(renderArgs._details);1292 _offscreenContext->makeCurrent();
1293 _frameCount++;
1294 Stats::getInstance()->setRenderDetails(renderArgs._details);
1281 1295
1282 // Reset the gpu::Context Stages1296 // Reset the gpu::Context Stages
1283 // Back to the default framebuffer;1297 // Back to the default framebuffer;
1284 doInBatch(renderArgs._context, [=](gpu::Batch& batch) {1298 gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) {
1285 batch.resetStages();1299 batch.resetStages();
1286 });1300 });
1301 }
1287}1302}
1288 1303
1289void Application::runTests() {1304void Application::runTests() {