コード例 #1
0
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;
}
コード例 #2
0
ファイル: RenderBase.cpp プロジェクト: Tinob/Ishiiruka
// 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;
}
コード例 #3
0
ファイル: RenderBase.cpp プロジェクト: Antidote/dolphin
// 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;
}
コード例 #4
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;
}