TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc) { TargetRectangle result; result.left = EFBToScaledX(rc.left); result.top = EFBToScaledY(rc.top); result.right = EFBToScaledX(rc.right); result.bottom = EFBToScaledY(rc.bottom); return result; }
// 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(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) { 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: 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(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; }