summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/SWRenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/Software/SWRenderer.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.cpp143
1 files changed, 6 insertions, 137 deletions
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.cpp b/Source/Core/VideoBackends/Software/SWRenderer.cpp
index 376cf89b11..c30b34720f 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.cpp
+++ b/Source/Core/VideoBackends/Software/SWRenderer.cpp
@@ -9,25 +9,17 @@
#include "Common/CommonTypes.h"
#include "Common/StringUtil.h"
-#include "Common/GL/GLInterfaceBase.h"
-#include "Common/GL/GLUtil.h"
#include "Core/Core.h"
-#include "VideoBackends/Software/RasterFont.h"
#include "VideoBackends/Software/SWCommandProcessor.h"
+#include "VideoBackends/Software/SWOGLWindow.h"
#include "VideoBackends/Software/SWRenderer.h"
#include "VideoBackends/Software/SWStatistics.h"
#include "VideoCommon/ImageWrite.h"
#include "VideoCommon/OnScreenDisplay.h"
-static GLuint s_RenderTarget = 0;
-
-static GLint attr_pos = -1, attr_tex = -1;
-static GLint uni_tex = -1;
-static GLuint program;
-
static u8 *s_xfbColorTexture[2];
static int s_currentColorTexture = 0;
@@ -35,11 +27,6 @@ static std::atomic<bool> s_bScreenshot;
static std::mutex s_criticalScreenshot;
static std::string s_sScreenshotName;
-
-// Rasterfont isn't compatible with GLES
-// degasus: I think it does, but I can't test it
-static RasterFont* s_pfont = nullptr;
-
void SWRenderer::Init()
{
s_bScreenshot.store(false);
@@ -49,45 +36,6 @@ void SWRenderer::Shutdown()
{
delete[] s_xfbColorTexture[0];
delete[] s_xfbColorTexture[1];
- glDeleteProgram(program);
- glDeleteTextures(1, &s_RenderTarget);
- if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL)
- {
- delete s_pfont;
- s_pfont = nullptr;
- }
-}
-
-static void CreateShaders()
-{
- static const char *fragShaderText =
- "#ifdef GL_ES\n"
- "precision highp float;\n"
- "#endif\n"
- "varying vec2 TexCoordOut;\n"
- "uniform sampler2D Texture;\n"
- "void main() {\n"
- " gl_FragColor = texture2D(Texture, TexCoordOut);\n"
- "}\n";
- static const char *vertShaderText =
- "#ifdef GL_ES\n"
- "precision highp float;\n"
- "#endif\n"
- "attribute vec4 pos;\n"
- "attribute vec2 TexCoordIn;\n "
- "varying vec2 TexCoordOut;\n "
- "void main() {\n"
- " gl_Position = pos;\n"
- " TexCoordOut = TexCoordIn;\n"
- "}\n";
-
- program = OpenGL_CompileProgram(vertShaderText, fragShaderText);
-
- glUseProgram(program);
-
- uni_tex = glGetUniformLocation(program, "Texture");
- attr_pos = glGetAttribLocation(program, "pos");
- attr_tex = glGetAttribLocation(program, "TexCoordIn");
}
void SWRenderer::Prepare()
@@ -96,18 +44,6 @@ void SWRenderer::Prepare()
s_xfbColorTexture[1] = new u8[MAX_XFB_WIDTH * MAX_XFB_HEIGHT * 4];
s_currentColorTexture = 0;
-
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
- glGenTextures(1, &s_RenderTarget);
-
- CreateShaders();
- // TODO: Enable for GLES once RasterFont supports GLES
- if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL)
- {
- s_pfont = new RasterFont();
- glEnable(GL_TEXTURE_2D);
- }
}
void SWRenderer::SetScreenshot(const char *_szFilename)
@@ -119,16 +55,7 @@ void SWRenderer::SetScreenshot(const char *_szFilename)
void SWRenderer::RenderText(const char* pstr, int left, int top, u32 color)
{
- if (GLInterface->GetMode() != GLInterfaceMode::MODE_OPENGL)
- return;
- int nBackbufferWidth = (int)GLInterface->GetBackBufferWidth();
- int nBackbufferHeight = (int)GLInterface->GetBackBufferHeight();
- glColor4f(((color >> 16) & 0xff) / 255.0f, ((color >> 8) & 0xff) / 255.0f,
- ((color >> 0) & 0xff) / 255.0f, ((color >> 24) & 0xFF) / 255.0f);
- s_pfont->printMultilineText(pstr,
- left * 2.0f / (float)nBackbufferWidth - 1,
- 1 - top * 2.0f / (float)nBackbufferHeight,
- 0, nBackbufferWidth, nBackbufferHeight);
+ SWOGLWindow::s_instance->PrintText(pstr, left, top, color);
}
void SWRenderer::DrawDebugText()
@@ -213,81 +140,23 @@ void SWRenderer::UpdateColorTexture(EfbInterface::yuv422_packed *xfb, u32 fbWidt
// Called on the GPU thread
void SWRenderer::Swap(u32 fbWidth, u32 fbHeight)
{
- GLInterface->Update(); // just updates the render window position and the backbuffer size
- SWRenderer::DrawTexture(GetCurrentColorTexture(), fbWidth, fbHeight);
-
- swstats.frameCount++;
- SWRenderer::SwapBuffer();
- Core::Callback_VideoCopiedToXFB(true); // FIXME: should this function be called FrameRendered?
-}
-
-void SWRenderer::DrawTexture(u8 *texture, int width, int height)
-{
- // FIXME: This should add black bars when the game has set the VI to render less than the full xfb.
-
// Save screenshot
if (s_bScreenshot.load())
{
std::lock_guard<std::mutex> lk(s_criticalScreenshot);
- TextureToPng(texture, width * 4, s_sScreenshotName, width, height, false);
+ TextureToPng(GetCurrentColorTexture(), fbWidth * 4, s_sScreenshotName, fbWidth, fbHeight, false);
// Reset settings
s_sScreenshotName.clear();
s_bScreenshot.store(false);
}
- GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth();
- GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight();
-
-
- // Update GLViewPort
- glViewport(0, 0, glWidth, glHeight);
- glScissor(0, 0, glWidth, glHeight);
-
- glBindTexture(GL_TEXTURE_2D, s_RenderTarget);
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
- glUseProgram(program);
- static const GLfloat verts[4][2] = {
- { -1, -1}, // Left top
- { -1, 1}, // left bottom
- { 1, 1}, // right bottom
- { 1, -1} // right top
- };
- static const GLfloat texverts[4][2] = {
- {0, 1},
- {0, 0},
- {1, 0},
- {1, 1}
- };
-
- glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, verts);
- glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, texverts);
- glEnableVertexAttribArray(attr_pos);
- glEnableVertexAttribArray(attr_tex);
- glUniform1i(uni_tex, 0);
- glActiveTexture(GL_TEXTURE0);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- glDisableVertexAttribArray(attr_pos);
- glDisableVertexAttribArray(attr_tex);
-
- glBindTexture(GL_TEXTURE_2D, 0);
-}
-
-void SWRenderer::SwapBuffer()
-{
- // Do our OSD callbacks
OSD::DoCallbacks(OSD::OSD_ONFRAME);
DrawDebugText();
- glFlush();
-
- GLInterface->Swap();
+ SWOGLWindow::s_instance->ShowImage(GetCurrentColorTexture(), fbWidth * 4, fbWidth, fbHeight, 1.0);
+ swstats.frameCount++;
swstats.ResetFrame();
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ Core::Callback_VideoCopiedToXFB(true); // FIXME: should this function be called FrameRendered?
}