summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/SWOGLWindow.cpp
diff options
context:
space:
mode:
authorflacs <tilkax@gmail.com>2015-10-17 04:56:44 +0200
committerflacs <tilkax@gmail.com>2015-10-17 04:56:44 +0200
commitd85344bd58afc6594d01d65ed9ef46471a7cf2ed (patch)
tree7d857b8cb30e648bc74b2a0aba4351ec82d5524f /Source/Core/VideoBackends/Software/SWOGLWindow.cpp
parentc0d157e6f6d4e482d7639bc9af05a21090a34ec4 (diff)
parentb69bff069055b32fc759d7722a773dc355c6b459 (diff)
Merge pull request #3155 from degasus/videosw
VideoSW: Split up OGL window handling
Diffstat (limited to 'Source/Core/VideoBackends/Software/SWOGLWindow.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/SWOGLWindow.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.cpp b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp
new file mode 100644
index 0000000000..be4ee68e32
--- /dev/null
+++ b/Source/Core/VideoBackends/Software/SWOGLWindow.cpp
@@ -0,0 +1,130 @@
+// Copyright 2015 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "Common/GL/GLInterfaceBase.h"
+#include "Common/GL/GLUtil.h"
+#include "Common/Logging/Log.h"
+
+#include "VideoBackends/Software/SWOGLWindow.h"
+
+std::unique_ptr<SWOGLWindow> SWOGLWindow::s_instance;
+
+void SWOGLWindow::Init(void *window_handle)
+{
+ InitInterface();
+ GLInterface->SetMode(GLInterfaceMode::MODE_DETECT);
+ if (!GLInterface->Create(window_handle))
+ {
+ INFO_LOG(VIDEO, "GLInterface::Create failed.");
+ }
+
+ s_instance.reset(new SWOGLWindow());
+}
+
+void SWOGLWindow::Shutdown()
+{
+ GLInterface->Shutdown();
+ delete GLInterface;
+ GLInterface = nullptr;
+
+ SWOGLWindow::s_instance.release();
+}
+
+void SWOGLWindow::Prepare()
+{
+ if (m_init) return;
+ m_init = true;
+
+ // Init extension support.
+ if (!GLExtensions::Init())
+ {
+ ERROR_LOG(VIDEO, "GLExtensions::Init failed!Does your video card support OpenGL 2.0?");
+ return;
+ }
+ else if (GLExtensions::Version() < 310)
+ {
+ ERROR_LOG(VIDEO, "OpenGL Version %d detected, but at least 3.1 is required.", GLExtensions::Version());
+ return;
+ }
+
+ std::string frag_shader =
+ "in vec2 TexCoord;\n"
+ "out vec4 ColorOut;\n"
+ "uniform sampler2D Texture;\n"
+ "void main() {\n"
+ " ColorOut = texture2D(Texture, TexCoord);\n"
+ "}\n";
+
+ std::string vertex_shader =
+ "out vec2 TexCoord;\n"
+ "void main() {\n"
+ " vec2 rawpos = vec2(gl_VertexID & 1, (gl_VertexID & 2) >> 1);\n"
+ " gl_Position = vec4(rawpos * 2.0 - 1.0, 0.0, 1.0);\n"
+ " TexCoord = vec2(rawpos.x, -rawpos.y);\n"
+ "}\n";
+
+ std::string header =
+ GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL ?
+ "#version 140\n"
+ :
+ "#version 300 es\n"
+ "precision highp float;\n";
+
+ m_image_program = OpenGL_CompileProgram(header + vertex_shader, header + frag_shader);
+
+ glUseProgram(m_image_program);
+
+ glUniform1i(glGetUniformLocation(m_image_program, "Texture"), 0);
+
+ glGenTextures(1, &m_image_texture);
+ glBindTexture(GL_TEXTURE_2D, m_image_texture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ glGenVertexArrays(1, &m_image_vao);
+}
+
+void SWOGLWindow::PrintText(const std::string& text, int x, int y, u32 color)
+{
+ TextData data{text, x, y, color};
+ m_text.emplace_back(data);
+}
+
+void SWOGLWindow::ShowImage(u8* data, int stride, int width, int height, float aspect)
+{
+ GLInterface->MakeCurrent();
+ GLInterface->Update();
+ Prepare();
+
+ GLsizei glWidth = (GLsizei)GLInterface->GetBackBufferWidth();
+ GLsizei glHeight = (GLsizei)GLInterface->GetBackBufferHeight();
+
+ glViewport(0, 0, glWidth, glHeight);
+
+ glBindTexture(GL_TEXTURE_2D, m_image_texture);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / 4);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+
+ glUseProgram(m_image_program);
+
+ glBindVertexArray(m_image_vao);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+// TODO: implement OSD
+// for (TextData& text : m_text)
+// {
+// }
+ m_text.clear();
+
+ GLInterface->Swap();
+ GLInterface->ClearCurrent();
+}
+
+int SWOGLWindow::PeekMessages()
+{
+ return GLInterface->PeekMessages();
+}
+