Exemplo n.º 1
0
// 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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
// 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;
}
Exemplo n.º 5
0
// 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;
}
Exemplo n.º 6
0
// 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;
}
Exemplo n.º 7
0
// 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;
}