Merge pull request #1736 from degasus/osd

OSD
This commit is contained in:
Ryan Houdek 2014-12-20 23:21:24 -06:00
commit 59e1a8a1a0
7 changed files with 136 additions and 192 deletions

View file

@ -8,13 +8,11 @@
#include <strsafe.h> #include <strsafe.h>
#include <unordered_map> #include <unordered_map>
#include "Common/Profiler.h"
#include "Common/Timer.h" #include "Common/Timer.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/Host.h" #include "Core/Host.h"
#include "Core/Movie.h"
#include "VideoBackends/D3D/BoundingBox.h" #include "VideoBackends/D3D/BoundingBox.h"
#include "VideoBackends/D3D/D3DBase.h" #include "VideoBackends/D3D/D3DBase.h"
@ -277,6 +275,7 @@ Renderer::~Renderer()
void Renderer::RenderText(const std::string& text, int left, int top, u32 color) void Renderer::RenderText(const std::string& text, int left, int top, u32 color)
{ {
D3D::font.DrawTextScaled((float)(left+1), (float)(top+1), 20.f, 0.0f, color & 0xFF000000, text);
D3D::font.DrawTextScaled((float)left, (float)top, 20.f, 0.0f, color, text); D3D::font.DrawTextScaled((float)left, (float)top, 20.f, 0.0f, color, text);
} }
@ -914,54 +913,8 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
vp = CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetBackbufferWidth(), (float)GetBackbufferHeight()); vp = CD3D11_VIEWPORT(0.0f, 0.0f, (float)GetBackbufferWidth(), (float)GetBackbufferHeight());
D3D::context->RSSetViewports(1, &vp); D3D::context->RSSetViewports(1, &vp);
// Finish up the current frame, print some stats
if (g_ActiveConfig.bShowFPS || SConfig::GetInstance().m_ShowFrameCount)
{
std::string fps = "";
if (g_ActiveConfig.bShowFPS)
fps = StringFromFormat("FPS: %d", m_fps_counter.m_fps);
if (g_ActiveConfig.bShowFPS && SConfig::GetInstance().m_ShowFrameCount)
fps += " - ";
if (SConfig::GetInstance().m_ShowFrameCount)
{
fps += StringFromFormat("Frame: %d", Movie::g_currentFrame);
if (Movie::IsPlayingInput())
fps += StringFromFormat(" / %d", Movie::g_totalFrames);
}
fps += "\n";
D3D::font.DrawTextScaled(0, 0, 20, 0.0f, 0xFF00FFFF, fps);
}
if (SConfig::GetInstance().m_ShowLag)
{
std::string lag = StringFromFormat("Lag: %" PRIu64 "\n", Movie::g_currentLagCount);
D3D::font.DrawTextScaled(0, 18, 20, 0.0f, 0xFF00FFFF, lag);
}
if (SConfig::GetInstance().m_ShowInputDisplay)
{
D3D::font.DrawTextScaled(0, 36, 20, 0.0f, 0xFF00FFFF, Movie::GetInputDisplay());
}
Renderer::DrawDebugText(); Renderer::DrawDebugText();
if (g_ActiveConfig.bOverlayStats)
{
D3D::font.DrawTextScaled(0, 36, 20, 0.0f, 0xFF00FFFF, Statistics::ToString());
}
else if (g_ActiveConfig.bOverlayProjStats)
{
D3D::font.DrawTextScaled(0, 36, 20, 0.0f, 0xFF00FFFF, Statistics::ToStringProj());
}
std::string profile_output = Profiler::ToString();
if (!profile_output.empty())
{
D3D::font.DrawTextScaled(0, 44, 20, 0.0f, 0xFF00FFFF, profile_output);
}
OSD::DrawMessages(); OSD::DrawMessages();
D3D::EndFrame(); D3D::EndFrame();

View file

@ -118,11 +118,12 @@ static const u8 rasters[CHAR_COUNT][CHAR_HEIGHT] = {
static const char *s_vertexShaderSrc = static const char *s_vertexShaderSrc =
"uniform vec2 charSize;\n" "uniform vec2 charSize;\n"
"uniform vec2 offset;"
"in vec2 rawpos;\n" "in vec2 rawpos;\n"
"in vec2 tex0;\n" "in vec2 tex0;\n"
"out vec2 uv0;\n" "out vec2 uv0;\n"
"void main(void) {\n" "void main(void) {\n"
" gl_Position = vec4(rawpos,0,1);\n" " gl_Position = vec4(rawpos + offset,0,1);\n"
" uv0 = tex0 * charSize;\n" " uv0 = tex0 * charSize;\n"
"}\n"; "}\n";
@ -166,7 +167,8 @@ RasterFont::RasterFont()
glUniform2f(glGetUniformLocation(s_shader.glprogid,"charSize"), 1.0f / GLfloat(CHAR_COUNT), 1.0f); glUniform2f(glGetUniformLocation(s_shader.glprogid,"charSize"), 1.0f / GLfloat(CHAR_COUNT), 1.0f);
uniform_color_id = glGetUniformLocation(s_shader.glprogid,"color"); uniform_color_id = glGetUniformLocation(s_shader.glprogid,"color");
glUniform4f(uniform_color_id, 1.0f, 1.0f, 1.0f, 1.0f); glUniform4f(uniform_color_id, 1.0f, 1.0f, 1.0f, 1.0f);
cached_color = -1; uniform_offset_id = glGetUniformLocation(s_shader.glprogid, "offset");
glUniform2f(uniform_offset_id, 0.0f, 0.0f);
// generate VBO & VAO // generate VBO & VAO
glGenBuffers(1, &VBO); glGenBuffers(1, &VBO);
@ -263,13 +265,13 @@ void RasterFont::printMultilineText(const std::string& text, double start_x, dou
s_shader.Bind(); s_shader.Bind();
if (color != cached_color) // shadows
{ glUniform2f(uniform_offset_id, 2.0f / GLfloat(bbWidth), -2.0f / GLfloat(bbHeight));
glUniform4f(uniform_color_id, GLfloat((color>>16)&0xff)/255.f,GLfloat((color>>8)&0xff)/255.f,GLfloat((color>>0)&0xff)/255.f,GLfloat((color>>24)&0xff)/255.f); glUniform4f(uniform_color_id, 0.0f, 0.0f, 0.0f, GLfloat((color>>24)&0xff)/255.f);
cached_color = color; glDrawArrays(GL_TRIANGLES, 0, usage/4);
}
glActiveTexture(GL_TEXTURE0+8); glUniform2f(uniform_offset_id, 0.0f, 0.0f);
glUniform4f(uniform_color_id, GLfloat((color>>16)&0xff)/255.f,GLfloat((color>>8)&0xff)/255.f,GLfloat((color>>0)&0xff)/255.f,GLfloat((color>>24)&0xff)/255.f);
glDrawArrays(GL_TRIANGLES, 0, usage/4); glDrawArrays(GL_TRIANGLES, 0, usage/4);
} }

View file

@ -25,7 +25,7 @@ private:
u32 VAO; u32 VAO;
u32 texture; u32 texture;
u32 uniform_color_id; u32 uniform_color_id;
u32 cached_color; u32 uniform_offset_id;
}; };
} }

View file

@ -12,14 +12,12 @@
#include "Common/Atomic.h" #include "Common/Atomic.h"
#include "Common/CommonPaths.h" #include "Common/CommonPaths.h"
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Common/Profiler.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Common/Thread.h" #include "Common/Thread.h"
#include "Common/Timer.h" #include "Common/Timer.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/Movie.h"
#include "VideoBackends/OGL/BoundingBox.h" #include "VideoBackends/OGL/BoundingBox.h"
#include "VideoBackends/OGL/FramebufferManager.h" #include "VideoBackends/OGL/FramebufferManager.h"
@ -721,40 +719,8 @@ void Renderer::Init()
} }
// Create On-Screen-Messages // Create On-Screen-Messages
void Renderer::DrawDebugInfo() void Renderer::ShowEfbCopyRegions()
{ {
// Reset viewport for drawing text
glViewport(0, 0, GLInterface->GetBackBufferWidth(), GLInterface->GetBackBufferHeight());
// Draw various messages on the screen, like FPS, statistics, etc.
std::string debug_info;
if (g_ActiveConfig.bShowFPS || SConfig::GetInstance().m_ShowFrameCount)
{
std::string fps = "";
if (g_ActiveConfig.bShowFPS)
debug_info += StringFromFormat("FPS: %d", m_fps_counter.m_fps);
if (g_ActiveConfig.bShowFPS && SConfig::GetInstance().m_ShowFrameCount)
debug_info += " - ";
if (SConfig::GetInstance().m_ShowFrameCount)
{
debug_info += StringFromFormat("Frame: %llu", (unsigned long long) Movie::g_currentFrame);
if (Movie::IsPlayingInput())
debug_info += StringFromFormat(" / %llu", (unsigned long long) Movie::g_totalFrames);
}
debug_info += "\n";
}
if (SConfig::GetInstance().m_ShowLag)
debug_info += StringFromFormat("Lag: %" PRIu64 "\n", Movie::g_currentLagCount);
if (SConfig::GetInstance().m_ShowInputDisplay)
debug_info += Movie::GetInputDisplay();
debug_info += Profiler::ToString();
if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL && g_ActiveConfig.bShowEFBCopyRegions) if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL && g_ActiveConfig.bShowEFBCopyRegions)
{ {
// Set Line Size // Set Line Size
@ -872,19 +838,6 @@ void Renderer::DrawDebugInfo()
// Clear stored regions // Clear stored regions
stats.efb_regions.clear(); stats.efb_regions.clear();
} }
if (g_ActiveConfig.bOverlayStats)
debug_info += Statistics::ToString();
if (g_ActiveConfig.bOverlayProjStats)
debug_info += Statistics::ToStringProj();
if (!debug_info.empty())
{
// Render a shadow, and then the text.
Renderer::RenderText(debug_info, 21, 21, 0xDD000000);
Renderer::RenderText(debug_info, 20, 20, 0xFF00FFFF);
}
} }
void Renderer::RenderText(const std::string& text, int left, int top, u32 color) void Renderer::RenderText(const std::string& text, int left, int top, u32 color)
@ -1715,7 +1668,10 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
DrawDebugInfo(); // Reset viewport for drawing text
glViewport(0, 0, GLInterface->GetBackBufferWidth(), GLInterface->GetBackBufferHeight());
ShowEfbCopyRegions();
DrawDebugText(); DrawDebugText();
// Do our OSD callbacks // Do our OSD callbacks

View file

@ -66,7 +66,7 @@ public:
void RestoreState() override {} void RestoreState() override {}
void RenderText(const std::string& text, int left, int top, u32 color) override; void RenderText(const std::string& text, int left, int top, u32 color) override;
void DrawDebugInfo(); void ShowEfbCopyRegions();
void FlipImageData(u8 *data, int w, int h, int pixel_width = 3); void FlipImageData(u8 *data, int w, int h, int pixel_width = 3);
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override; u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;

View file

@ -56,7 +56,6 @@ void DrawMessages()
alpha <<= 24; alpha <<= 24;
g_renderer->RenderText(it->str, left + 1, top + 1, 0x000000 | alpha);
g_renderer->RenderText(it->str, left, top, 0xffff30 | alpha); g_renderer->RenderText(it->str, left, top, 0xffff30 | alpha);
top += 15; top += 15;

View file

@ -12,16 +12,19 @@
// Next frame, that one is scanned out and the other one gets the copy. = double buffering. // Next frame, that one is scanned out and the other one gets the copy. = double buffering.
// --------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------
#include <cinttypes>
#include <cmath> #include <cmath>
#include <string> #include <string>
#include "Common/Atomic.h" #include "Common/Atomic.h"
#include "Common/Profiler.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Common/Timer.h" #include "Common/Timer.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/Host.h" #include "Core/Host.h"
#include "Core/Movie.h"
#include "Core/FifoPlayer/FifoRecorder.h" #include "Core/FifoPlayer/FifoRecorder.h"
#include "VideoCommon/AVIDump.h" #include "VideoCommon/AVIDump.h"
@ -286,6 +289,39 @@ void Renderer::SetScreenshot(const std::string& filename)
// Create On-Screen-Messages // Create On-Screen-Messages
void Renderer::DrawDebugText() void Renderer::DrawDebugText()
{ {
std::string final_yellow, final_cyan;
if (g_ActiveConfig.bShowFPS || SConfig::GetInstance().m_ShowFrameCount)
{
std::string fps = "";
if (g_ActiveConfig.bShowFPS)
final_cyan += StringFromFormat("FPS: %d", g_renderer->m_fps_counter.m_fps);
if (g_ActiveConfig.bShowFPS && SConfig::GetInstance().m_ShowFrameCount)
final_cyan += " - ";
if (SConfig::GetInstance().m_ShowFrameCount)
{
final_cyan += StringFromFormat("Frame: %llu", (unsigned long long) Movie::g_currentFrame);
if (Movie::IsPlayingInput())
final_cyan += StringFromFormat(" / %llu", (unsigned long long) Movie::g_totalFrames);
}
final_cyan += "\n";
final_yellow += "\n";
}
if (SConfig::GetInstance().m_ShowLag)
{
final_cyan += StringFromFormat("Lag: %" PRIu64 "\n", Movie::g_currentLagCount);
final_yellow += "\n";
}
if (SConfig::GetInstance().m_ShowInputDisplay)
{
final_cyan += Movie::GetInputDisplay();
final_yellow += "\n";
}
// OSD Menu messages // OSD Menu messages
if (OSDChoice > 0) if (OSDChoice > 0)
{ {
@ -293,96 +329,94 @@ void Renderer::DrawDebugText()
OSDChoice = -OSDChoice; OSDChoice = -OSDChoice;
} }
if ((u32)OSDTime <= Common::Timer::GetTimeMs()) if ((u32)OSDTime > Common::Timer::GetTimeMs())
return;
const char* res_text = "";
switch (g_ActiveConfig.iEFBScale)
{ {
case SCALE_AUTO:
res_text = "Auto (fractional)"; const char* res_text = "";
break; switch (g_ActiveConfig.iEFBScale)
case SCALE_AUTO_INTEGRAL: {
res_text = "Auto (integral)"; case SCALE_AUTO:
break; res_text = "Auto (fractional)";
case SCALE_1X: break;
res_text = "Native"; case SCALE_AUTO_INTEGRAL:
break; res_text = "Auto (integral)";
case SCALE_1_5X: break;
res_text = "1.5x"; case SCALE_1X:
break; res_text = "Native";
case SCALE_2X: break;
res_text = "2x"; case SCALE_1_5X:
break; res_text = "1.5x";
case SCALE_2_5X: break;
res_text = "2.5x"; case SCALE_2X:
break; res_text = "2x";
case SCALE_3X: break;
res_text = "3x"; case SCALE_2_5X:
break; res_text = "2.5x";
case SCALE_4X: break;
res_text = "4x"; case SCALE_3X:
break; res_text = "3x";
break;
case SCALE_4X:
res_text = "4x";
break;
}
const char* ar_text = "";
switch (g_ActiveConfig.iAspectRatio)
{
case ASPECT_AUTO:
ar_text = "Auto";
break;
case ASPECT_FORCE_16_9:
ar_text = "16:9";
break;
case ASPECT_FORCE_4_3:
ar_text = "4:3";
break;
case ASPECT_STRETCH:
ar_text = "Stretch";
break;
}
const char* const efbcopy_text = g_ActiveConfig.bEFBCopyEnable ?
(g_ActiveConfig.bCopyEFBToTexture ? "to Texture" : "to RAM") : "Disabled";
// The rows
const std::string lines[] =
{
std::string("Internal Resolution: ") + res_text,
std::string("Aspect Ratio: ") + ar_text + (g_ActiveConfig.bCrop ? " (crop)" : ""),
std::string("Copy EFB: ") + efbcopy_text,
std::string("Fog: ") + (g_ActiveConfig.bDisableFog ? "Disabled" : "Enabled"),
};
enum { lines_count = sizeof(lines)/sizeof(*lines) };
// The latest changed setting in yellow
for (int i = 0; i != lines_count; ++i)
{
if (OSDChoice == -i - 1)
final_yellow += lines[i];
final_yellow += '\n';
}
// The other settings in cyan
for (int i = 0; i != lines_count; ++i)
{
if (OSDChoice != -i - 1)
final_cyan += lines[i];
final_cyan += '\n';
}
} }
const char* ar_text = ""; final_cyan += Profiler::ToString();
switch (g_ActiveConfig.iAspectRatio)
{
case ASPECT_AUTO:
ar_text = "Auto";
break;
case ASPECT_FORCE_16_9:
ar_text = "16:9";
break;
case ASPECT_FORCE_4_3:
ar_text = "4:3";
break;
case ASPECT_STRETCH:
ar_text = "Stretch";
break;
}
const char* const efbcopy_text = g_ActiveConfig.bEFBCopyEnable ? if (g_ActiveConfig.bOverlayStats)
(g_ActiveConfig.bCopyEFBToTexture ? "to Texture" : "to RAM") : "Disabled"; final_cyan += Statistics::ToString();
// The rows if (g_ActiveConfig.bOverlayProjStats)
const std::string lines[] = final_cyan += Statistics::ToStringProj();
{
std::string("3: Internal Resolution: ") + res_text,
std::string("4: Aspect Ratio: ") + ar_text + (g_ActiveConfig.bCrop ? " (crop)" : ""),
std::string("5: Copy EFB: ") + efbcopy_text,
std::string("6: Fog: ") + (g_ActiveConfig.bDisableFog ? "Disabled" : "Enabled"),
};
enum { lines_count = sizeof(lines)/sizeof(*lines) };
std::string final_yellow, final_cyan;
// If there is more text than this we will have a collision
if (g_ActiveConfig.bShowFPS)
{
final_yellow = final_cyan = "\n\n";
}
// The latest changed setting in yellow
for (int i = 0; i != lines_count; ++i)
{
if (OSDChoice == -i - 1)
final_yellow += lines[i];
final_yellow += '\n';
}
// The other settings in cyan
for (int i = 0; i != lines_count; ++i)
{
if (OSDChoice != -i - 1)
final_cyan += lines[i];
final_cyan += '\n';
}
// Render a shadow
g_renderer->RenderText(final_cyan, 21, 21, 0xDD000000);
g_renderer->RenderText(final_yellow, 21, 21, 0xDD000000);
//and then the text //and then the text
g_renderer->RenderText(final_cyan, 20, 20, 0xFF00FFFF); g_renderer->RenderText(final_cyan, 20, 20, 0xFF00FFFF);
g_renderer->RenderText(final_yellow, 20, 20, 0xFFFFFF00); g_renderer->RenderText(final_yellow, 20, 20, 0xFFFFFF00);