// return true if target size changed bool Renderer::CalculateTargetSize(int multiplier) { int newEFBWidth, newEFBHeight; switch (s_LastEFBScale) { case 0: // fractional newEFBWidth = (int)(EFB_WIDTH * xScale); newEFBHeight = (int)(EFB_HEIGHT * yScale); break; case 1: // integral newEFBWidth = EFB_WIDTH * (int)ceilf(xScale); newEFBHeight = EFB_HEIGHT * (int)ceilf(yScale); break; default: CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT, newEFBWidth, newEFBHeight); } newEFBWidth *= multiplier; newEFBHeight *= multiplier; if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { s_target_width = newEFBWidth; s_target_height = newEFBHeight; return true; } return false; }
void Renderer::SetWindowSize(int width, int height) { if (width < 1) width = 1; if (height < 1) height = 1; // Scale the window size by the EFB scale. CalculateTargetScale(width, height, &width, &height); Host_RequestRenderWindowSize(width, height); }
void Renderer::SetWindowSize(u32 width, u32 height) { width = std::max(width, 16u); height = std::max(height, 16u); // Scale the window size by the EFB scale. std::tie(width, height) = CalculateTargetScale(width, height); float scaled_width, scaled_height; std::tie(scaled_width, scaled_height) = ScaleToDisplayAspectRatio(width, height); if (g_ActiveConfig.bCrop) { // Force 4:3 or 16:9 by cropping the image. float current_aspect = scaled_width / scaled_height; float expected_aspect = (g_ActiveConfig.iAspectRatio == ASPECT_ANALOG_WIDE || (g_ActiveConfig.iAspectRatio != ASPECT_ANALOG && m_aspect_wide)) ? (16.0f / 9.0f) : (4.0f / 3.0f); if (current_aspect > expected_aspect) { // keep height, crop width scaled_width = scaled_height * expected_aspect; } else { // keep width, crop height scaled_height = scaled_width / expected_aspect; } } width = static_cast<int>(std::ceil(scaled_width)); height = static_cast<int>(std::ceil(scaled_height)); // UpdateDrawRectangle() makes sure that the rendered image is divisible by four for video // encoders, so do that here too to match it width -= width % 4; height -= height % 4; Host_RequestRenderWindowSize(width, height); }
// return true if target size changed bool Renderer::CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height) { int newEFBWidth, newEFBHeight; newEFBWidth = newEFBHeight = 0; // TODO: Ugly. Clean up switch (s_last_efb_scale) { case SCALE_AUTO: case SCALE_AUTO_INTEGRAL: newEFBWidth = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH); newEFBHeight = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT); if (s_last_efb_scale == SCALE_AUTO_INTEGRAL) { newEFBWidth = ((newEFBWidth-1) / EFB_WIDTH + 1) * EFB_WIDTH; newEFBHeight = ((newEFBHeight-1) / EFB_HEIGHT + 1) * EFB_HEIGHT; } efb_scale_numeratorX = newEFBWidth; efb_scale_denominatorX = EFB_WIDTH; efb_scale_numeratorY = newEFBHeight; efb_scale_denominatorY = EFB_HEIGHT; break; case SCALE_1X: efb_scale_numeratorX = efb_scale_numeratorY = 1; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case SCALE_1_5X: efb_scale_numeratorX = efb_scale_numeratorY = 3; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; case SCALE_2X: efb_scale_numeratorX = efb_scale_numeratorY = 2; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case SCALE_2_5X: efb_scale_numeratorX = efb_scale_numeratorY = 5; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; default: efb_scale_numeratorX = efb_scale_numeratorY = s_last_efb_scale - 3; efb_scale_denominatorX = efb_scale_denominatorY = 1; int maxSize; maxSize = GetMaxTextureSize(); if ((unsigned)maxSize < EFB_WIDTH * efb_scale_numeratorX / efb_scale_denominatorX) { efb_scale_numeratorX = efb_scale_numeratorY = (maxSize / EFB_WIDTH); efb_scale_denominatorX = efb_scale_denominatorY = 1; } break; } if (s_last_efb_scale > SCALE_AUTO_INTEGRAL) CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT, &newEFBWidth, &newEFBHeight); if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { s_target_width = newEFBWidth; s_target_height = newEFBHeight; return true; } return false; }
// return true if target size changed bool Renderer::CalculateTargetSize(unsigned int framebuffer_width, unsigned int framebuffer_height, int multiplier) { int newEFBWidth, newEFBHeight; // TODO: Ugly. Clean up switch (s_LastEFBScale) { case 2: // 1x efb_scale_numeratorX = efb_scale_numeratorY = 1; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case 3: // 1.5x efb_scale_numeratorX = efb_scale_numeratorY = 3; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; case 4: // 2x efb_scale_numeratorX = efb_scale_numeratorY = 2; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case 5: // 2.5x efb_scale_numeratorX = efb_scale_numeratorY = 5; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; case 6: // 3x efb_scale_numeratorX = efb_scale_numeratorY = 3; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case 7: // 4x efb_scale_numeratorX = efb_scale_numeratorY = 4; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; default: // fractional & integral handled later break; } switch (s_LastEFBScale) { case 0: // fractional case 1: // integral newEFBWidth = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH, framebuffer_width); newEFBHeight = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT, framebuffer_height); if (s_LastEFBScale == 1) { newEFBWidth = ((newEFBWidth-1) / EFB_WIDTH + 1) * EFB_WIDTH; newEFBHeight = ((newEFBHeight-1) / EFB_HEIGHT + 1) * EFB_HEIGHT; } efb_scale_numeratorX = newEFBWidth; efb_scale_denominatorX = EFB_WIDTH; efb_scale_numeratorY = newEFBHeight; efb_scale_denominatorY = EFB_HEIGHT; break; default: CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT, newEFBWidth, newEFBHeight); break; } newEFBWidth *= multiplier; newEFBHeight *= multiplier; ssaa_multiplier = multiplier; if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { s_target_width = newEFBWidth; s_target_height = newEFBHeight; VertexShaderManager::SetViewportChanged(); return true; } return false; }
// return true if target size changed bool Renderer::CalculateTargetSize(int multiplier) { int new_efb_width = 0; int new_efb_height = 0; m_last_efb_scale = g_ActiveConfig.iEFBScale; switch (m_last_efb_scale) { case SCALE_AUTO: case SCALE_AUTO_INTEGRAL: new_efb_width = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH); new_efb_height = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT); if (m_last_efb_scale == SCALE_AUTO_INTEGRAL) { m_efb_scale_numeratorX = m_efb_scale_numeratorY = std::max((new_efb_width - 1) / EFB_WIDTH + 1, (new_efb_height - 1) / EFB_HEIGHT + 1); m_efb_scale_denominatorX = m_efb_scale_denominatorY = 1; new_efb_width = EFBToScaledX(EFB_WIDTH); new_efb_height = EFBToScaledY(EFB_HEIGHT); } else { m_efb_scale_numeratorX = new_efb_width; m_efb_scale_denominatorX = EFB_WIDTH; m_efb_scale_numeratorY = new_efb_height; m_efb_scale_denominatorY = EFB_HEIGHT; } break; case SCALE_1X: m_efb_scale_numeratorX = m_efb_scale_numeratorY = 1; m_efb_scale_denominatorX = m_efb_scale_denominatorY = 1; break; case SCALE_1_5X: m_efb_scale_numeratorX = m_efb_scale_numeratorY = 3; m_efb_scale_denominatorX = m_efb_scale_denominatorY = 2; break; case SCALE_2X: m_efb_scale_numeratorX = m_efb_scale_numeratorY = 2; m_efb_scale_denominatorX = m_efb_scale_denominatorY = 1; break; case SCALE_2_5X: // 2.5x m_efb_scale_numeratorX = m_efb_scale_numeratorY = 5; m_efb_scale_denominatorX = m_efb_scale_denominatorY = 2; break; default: m_efb_scale_numeratorX = m_efb_scale_numeratorY = m_last_efb_scale - 3; m_efb_scale_denominatorX = m_efb_scale_denominatorY = 1; break; } const u32 max_size = g_ActiveConfig.backend_info.MaxTextureSize; if (max_size < EFB_WIDTH * multiplier * m_efb_scale_numeratorX / m_efb_scale_denominatorX) { m_efb_scale_numeratorX = m_efb_scale_numeratorY = (max_size / (EFB_WIDTH * multiplier)); m_efb_scale_denominatorX = m_efb_scale_denominatorY = 1; } if (m_last_efb_scale > SCALE_AUTO_INTEGRAL) std::tie(new_efb_width, new_efb_height) = CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT); new_efb_width *= multiplier; new_efb_height *= multiplier; m_ssaa_multiplier = multiplier; if (new_efb_width != m_target_width || new_efb_height != m_target_height) { m_target_width = new_efb_width; m_target_height = new_efb_height; m_efb_scale = float(m_target_width) / float(EFB_WIDTH); VertexShaderManager::SetViewportChanged(); GeometryShaderManager::SetViewportChanged(); PixelShaderManager::SetViewportChanged(); return true; } return false; }
// return true if target size changed bool Renderer::CalculateTargetSize(int multiplier) { int newEFBWidth = 0; int newEFBHeight = 0; // TODO: Ugly. Clean up switch (s_last_efb_scale) { case SCALE_AUTO: case SCALE_AUTO_INTEGRAL: newEFBWidth = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH); newEFBHeight = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT); if (s_last_efb_scale == SCALE_AUTO_INTEGRAL) { efb_scale_numeratorX = efb_scale_numeratorY = std::max((newEFBWidth - 1) / EFB_WIDTH + 1, (newEFBHeight - 1) / EFB_HEIGHT + 1); efb_scale_denominatorX = efb_scale_denominatorY = 1; newEFBWidth = EFBToScaledX(EFB_WIDTH); newEFBHeight = EFBToScaledY(EFB_HEIGHT); } else { efb_scale_numeratorX = newEFBWidth; efb_scale_denominatorX = EFB_WIDTH; efb_scale_numeratorY = newEFBHeight; efb_scale_denominatorY = EFB_HEIGHT; } break; case SCALE_1X: efb_scale_numeratorX = efb_scale_numeratorY = 1; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case SCALE_1_5X: efb_scale_numeratorX = efb_scale_numeratorY = 3; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; case SCALE_2X: efb_scale_numeratorX = efb_scale_numeratorY = 2; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; case SCALE_2_5X: // 2.5x efb_scale_numeratorX = efb_scale_numeratorY = 5; efb_scale_denominatorX = efb_scale_denominatorY = 2; break; default: efb_scale_numeratorX = efb_scale_numeratorY = s_last_efb_scale - 3; efb_scale_denominatorX = efb_scale_denominatorY = 1; break; } const u32 max_size = GetMaxTextureSize(); if (max_size < EFB_WIDTH * multiplier * efb_scale_numeratorX / efb_scale_denominatorX) { efb_scale_numeratorX = efb_scale_numeratorY = (max_size / (EFB_WIDTH * multiplier)); efb_scale_denominatorX = efb_scale_denominatorY = 1; } if (s_last_efb_scale > SCALE_AUTO_INTEGRAL) CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT, newEFBWidth, newEFBHeight); newEFBWidth *= multiplier; newEFBHeight *= multiplier; ssaa_multiplier = multiplier; if (newEFBWidth != s_target_width || newEFBHeight != s_target_height) { s_target_width = newEFBWidth; s_target_height = newEFBHeight; VertexShaderManager::SetViewportChanged(); GeometryShaderManager::SetViewportChanged(); PixelShaderManager::SetViewportChanged(); return true; } return false; }