summaryrefslogtreecommitdiff
path: root/Source/Core
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
parentc0d157e6f6d4e482d7639bc9af05a21090a34ec4 (diff)
parentb69bff069055b32fc759d7722a773dc355c6b459 (diff)
Merge pull request #3155 from degasus/videosw
VideoSW: Split up OGL window handling
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Common/GL/GLUtil.cpp24
-rw-r--r--Source/Core/Common/GL/GLUtil.h4
-rw-r--r--Source/Core/VideoBackends/Software/CMakeLists.txt14
-rw-r--r--Source/Core/VideoBackends/Software/RasterFont.cpp211
-rw-r--r--Source/Core/VideoBackends/Software/RasterFont.h27
-rw-r--r--Source/Core/VideoBackends/Software/SWOGLWindow.cpp130
-rw-r--r--Source/Core/VideoBackends/Software/SWOGLWindow.h45
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.cpp143
-rw-r--r--Source/Core/VideoBackends/Software/SWRenderer.h2
-rw-r--r--Source/Core/VideoBackends/Software/SWmain.cpp31
-rw-r--r--Source/Core/VideoBackends/Software/Software.vcxproj4
11 files changed, 210 insertions, 425 deletions
diff --git a/Source/Core/Common/GL/GLUtil.cpp b/Source/Core/Common/GL/GLUtil.cpp
index ece39e5a61..7f7161aab4 100644
--- a/Source/Core/Common/GL/GLUtil.cpp
+++ b/Source/Core/Common/GL/GLUtil.cpp
@@ -16,7 +16,7 @@ void InitInterface()
GLInterface = HostGL_CreateGLInterface();
}
-GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShader)
+GLuint OpenGL_CompileProgram(const std::string& vertexShader, const std::string& fragmentShader)
{
// generate objects
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
@@ -24,7 +24,8 @@ GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShade
GLuint programID = glCreateProgram();
// compile vertex shader
- glShaderSource(vertexShaderID, 1, &vertexShader, nullptr);
+ const char* shader = vertexShader.c_str();
+ glShaderSource(vertexShaderID, 1, &shader, nullptr);
glCompileShader(vertexShaderID);
#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL)
GLint Result = GL_FALSE;
@@ -35,22 +36,23 @@ GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShade
if (Result && stringBufferUsage)
{
- ERROR_LOG(VIDEO, "GLSL vertex shader warnings:\n%s%s", stringBuffer, vertexShader);
+ ERROR_LOG(VIDEO, "GLSL vertex shader warnings:\n%s%s", stringBuffer, vertexShader.c_str());
}
else if (!Result)
{
- ERROR_LOG(VIDEO, "GLSL vertex shader error:\n%s%s", stringBuffer, vertexShader);
+ ERROR_LOG(VIDEO, "GLSL vertex shader error:\n%s%s", stringBuffer, vertexShader.c_str());
}
else
{
- DEBUG_LOG(VIDEO, "GLSL vertex shader compiled:\n%s", vertexShader);
+ DEBUG_LOG(VIDEO, "GLSL vertex shader compiled:\n%s", vertexShader.c_str());
}
bool shader_errors = !Result;
#endif
// compile fragment shader
- glShaderSource(fragmentShaderID, 1, &fragmentShader, nullptr);
+ shader = fragmentShader.c_str();
+ glShaderSource(fragmentShaderID, 1, &shader, nullptr);
glCompileShader(fragmentShaderID);
#if defined(_DEBUG) || defined(DEBUGFAST) || defined(DEBUG_GLSL)
glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &Result);
@@ -58,15 +60,15 @@ GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShade
if (Result && stringBufferUsage)
{
- ERROR_LOG(VIDEO, "GLSL fragment shader warnings:\n%s%s", stringBuffer, fragmentShader);
+ ERROR_LOG(VIDEO, "GLSL fragment shader warnings:\n%s%s", stringBuffer, fragmentShader.c_str());
}
else if (!Result)
{
- ERROR_LOG(VIDEO, "GLSL fragment shader error:\n%s%s", stringBuffer, fragmentShader);
+ ERROR_LOG(VIDEO, "GLSL fragment shader error:\n%s%s", stringBuffer, fragmentShader.c_str());
}
else
{
- DEBUG_LOG(VIDEO, "GLSL fragment shader compiled:\n%s", fragmentShader);
+ DEBUG_LOG(VIDEO, "GLSL fragment shader compiled:\n%s", fragmentShader.c_str());
}
shader_errors |= !Result;
@@ -82,11 +84,11 @@ GLuint OpenGL_CompileProgram(const char* vertexShader, const char* fragmentShade
if (Result && stringBufferUsage)
{
- ERROR_LOG(VIDEO, "GLSL linker warnings:\n%s%s%s", stringBuffer, vertexShader, fragmentShader);
+ ERROR_LOG(VIDEO, "GLSL linker warnings:\n%s%s%s", stringBuffer, vertexShader.c_str(), fragmentShader.c_str());
}
else if (!Result && !shader_errors)
{
- ERROR_LOG(VIDEO, "GLSL linker error:\n%s%s%s", stringBuffer, vertexShader, fragmentShader);
+ ERROR_LOG(VIDEO, "GLSL linker error:\n%s%s%s", stringBuffer, vertexShader.c_str(), fragmentShader.c_str());
}
#endif
diff --git a/Source/Core/Common/GL/GLUtil.h b/Source/Core/Common/GL/GLUtil.h
index 1c3a9d8256..718ee225da 100644
--- a/Source/Core/Common/GL/GLUtil.h
+++ b/Source/Core/Common/GL/GLUtil.h
@@ -4,6 +4,8 @@
#pragma once
+#include <string>
+
#include "Common/GL/GLExtensions/GLExtensions.h"
#ifndef _WIN32
@@ -14,7 +16,7 @@
void InitInterface();
// Helpers
-GLuint OpenGL_CompileProgram(const char *vertexShader, const char *fragmentShader);
+GLuint OpenGL_CompileProgram(const std::string& vertexShader, const std::string& fragmentShader);
// Creates and deletes a VAO and VBO suitable for attributeless rendering.
// Called by the Renderer.
diff --git a/Source/Core/VideoBackends/Software/CMakeLists.txt b/Source/Core/VideoBackends/Software/CMakeLists.txt
index 7b86ffae5c..14bde663d1 100644
--- a/Source/Core/VideoBackends/Software/CMakeLists.txt
+++ b/Source/Core/VideoBackends/Software/CMakeLists.txt
@@ -1,23 +1,23 @@
set(SRCS BPMemLoader.cpp
- Clipper.cpp
- SWCommandProcessor.cpp
CPMemLoader.cpp
+ Clipper.cpp
DebugUtil.cpp
EfbCopy.cpp
EfbInterface.cpp
- SWmain.cpp
OpcodeDecoder.cpp
- RasterFont.cpp
Rasterizer.cpp
+ SWCommandProcessor.cpp
+ SWOGLWindow.cpp
SWRenderer.cpp
- SetupUnit.cpp
SWStatistics.cpp
+ SWVertexLoader.cpp
+ SWVideoConfig.cpp
+ SWmain.cpp
+ SetupUnit.cpp
Tev.cpp
TextureEncoder.cpp
TextureSampler.cpp
TransformUnit.cpp
- SWVertexLoader.cpp
- SWVideoConfig.cpp
XFMemLoader.cpp)
set(LIBS videocommon
diff --git a/Source/Core/VideoBackends/Software/RasterFont.cpp b/Source/Core/VideoBackends/Software/RasterFont.cpp
deleted file mode 100644
index ebbfe33a62..0000000000
--- a/Source/Core/VideoBackends/Software/RasterFont.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2008 Dolphin Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#include <string.h>
-
-#include "Common/GL/GLUtil.h"
-#include "VideoBackends/Software/RasterFont.h"
-
-const GLubyte rasters[][13] = {
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36},
- {0x00, 0x00, 0x00, 0x66, 0x66, 0xff, 0x66, 0x66, 0xff, 0x66, 0x66, 0x00, 0x00},
- {0x00, 0x00, 0x18, 0x7e, 0xff, 0x1b, 0x1f, 0x7e, 0xf8, 0xd8, 0xff, 0x7e, 0x18},
- {0x00, 0x00, 0x0e, 0x1b, 0xdb, 0x6e, 0x30, 0x18, 0x0c, 0x76, 0xdb, 0xd8, 0x70},
- {0x00, 0x00, 0x7f, 0xc6, 0xcf, 0xd8, 0x70, 0x70, 0xd8, 0xcc, 0xcc, 0x6c, 0x38},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x0e},
- {0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c},
- {0x00, 0x00, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30},
- {0x00, 0x00, 0x00, 0x00, 0x99, 0x5a, 0x3c, 0xff, 0x3c, 0x5a, 0x99, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x00, 0x00},
- {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x03},
- {0x00, 0x00, 0x3c, 0x66, 0xc3, 0xe3, 0xf3, 0xdb, 0xcf, 0xc7, 0xc3, 0x66, 0x3c},
- {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x38, 0x18},
- {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0xe7, 0x7e},
- {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0x07, 0x03, 0x03, 0xe7, 0x7e},
- {0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c},
- {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xff},
- {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
- {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x03, 0x03, 0xff},
- {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e},
- {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x03, 0x7f, 0xe7, 0xc3, 0xc3, 0xe7, 0x7e},
- {0x00, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x30, 0x18, 0x1c, 0x1c, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06},
- {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60},
- {0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x18, 0x0c, 0x06, 0x03, 0xc3, 0xc3, 0x7e},
- {0x00, 0x00, 0x3f, 0x60, 0xcf, 0xdb, 0xd3, 0xdd, 0xc3, 0x7e, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18},
- {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
- {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
- {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc},
- {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff},
- {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff},
- {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
- {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
- {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e},
- {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06},
- {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3},
- {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0},
- {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3},
- {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3},
- {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e},
- {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
- {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c},
- {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
- {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e},
- {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff},
- {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
- {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
- {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
- {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
- {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
- {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff},
- {0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c},
- {0x00, 0x03, 0x03, 0x06, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60},
- {0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18},
- {0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x30, 0x70},
- {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0x7f, 0x03, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0},
- {0x00, 0x00, 0x7e, 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x03, 0x03, 0x03, 0x03, 0x03},
- {0x00, 0x00, 0x7f, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x33, 0x1e},
- {0x7e, 0xc3, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0x7e, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0},
- {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00},
- {0x38, 0x6c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x0c, 0x00},
- {0x00, 0x00, 0xc6, 0xcc, 0xf8, 0xf0, 0xd8, 0xcc, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0},
- {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78},
- {0x00, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xfe, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00},
- {0xc0, 0xc0, 0xc0, 0xfe, 0xc3, 0xc3, 0xc3, 0xc3, 0xfe, 0x00, 0x00, 0x00, 0x00},
- {0x03, 0x03, 0x03, 0x7f, 0xc3, 0xc3, 0xc3, 0xc3, 0x7f, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xfe, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xfe, 0x03, 0x03, 0x7e, 0xc0, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x00},
- {0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00},
- {0xc0, 0x60, 0x60, 0x30, 0x18, 0x3c, 0x66, 0x66, 0xc3, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xff, 0x60, 0x30, 0x18, 0x0c, 0x06, 0xff, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x0f, 0x18, 0x18, 0x18, 0x38, 0xf0, 0x38, 0x18, 0x18, 0x18, 0x0f},
- {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18},
- {0x00, 0x00, 0xf0, 0x18, 0x18, 0x18, 0x1c, 0x0f, 0x1c, 0x18, 0x18, 0x18, 0xf0},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x8f, 0xf1, 0x60, 0x00, 0x00, 0x00}
-};
-
-RasterFont::RasterFont()
-{
- // set GL modes
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
- // create the raster font
- fontOffset = glGenLists(128);
- for (int i = 32; i < 127; i++)
- {
- glNewList(i + fontOffset, GL_COMPILE);
- glBitmap(8, 13, 0.0f, 2.0f, 10.0f, 0.0f, rasters[i - 32]);
- glEndList();
- }
-
- temp_buffer = new char[TEMP_BUFFER_SIZE];
-}
-
-RasterFont::~RasterFont()
-{
- glDeleteLists(fontOffset, 128);
- delete [] temp_buffer;
-}
-
-void RasterFont::printString(const char *s, double x, double y, double z)
-{
- int length = (int)strlen(s);
- if (!length)
- return;
- if (length >= TEMP_BUFFER_SIZE)
- length = TEMP_BUFFER_SIZE - 1;
-
- // Sanitize string to avoid GL errors.
- char *s2 = temp_buffer;
- memcpy(s2, s, length);
- s2[length] = 0;
- for (int i = 0; i < length; i++)
- {
- if (s2[i] < 32 || s2[i] > 126)
- s2[i] = '!';
- }
-
- // go to the right spot
- glRasterPos3d(x, y, z);
-
- glPushAttrib (GL_LIST_BIT);
- glListBase(fontOffset);
- glCallLists((GLsizei)strlen(s2), GL_UNSIGNED_BYTE, (GLubyte *) s2);
-
- glPopAttrib();
-}
-
-void RasterFont::printCenteredString(const char *s, double y, int screen_width, double z)
-{
- int length = (int)strlen(s);
- int x = (int)(screen_width/2.0 - (length/2.0) * CHAR_WIDTH);
- printString(s, x, y, z);
-}
-
-void RasterFont::printMultilineText(const char *text, double start_x, double start_y, double z, int bbWidth, int bbHeight)
-{
- double x = start_x;
- double y = start_y;
- char temp[1024];
- char *t = temp;
- while (*text)
- {
- if (*text == '\n')
- {
- *t = 0;
- printString(temp, x, y, z);
- y -= CHAR_HEIGHT * 2.0f / bbHeight;
- x = start_x;
- t = temp;
- }
- else if (*text == '\r')
- {
- t = temp;
- }
- else if (*text == '\t')
- {
- //todo: add tabs every something like 4 * CHAR_WIDTH
- *t = 0;
- int cpos = (int)strlen(temp);
- int newpos = (cpos + 4) & (~3);
- printString(temp, x, y, z);
- x = start_x + (CHAR_WIDTH * newpos) * 2.0f / bbWidth;
- t = temp;
- *t++ = ' ';
- }
- else
- {
- *t++ = *text;
- }
-
- text++;
- }
-
- // ????
- if (t != text)
- {
- *t = 0;
- printString(temp, x, y, z);
- }
-}
diff --git a/Source/Core/VideoBackends/Software/RasterFont.h b/Source/Core/VideoBackends/Software/RasterFont.h
deleted file mode 100644
index ceb6a9a222..0000000000
--- a/Source/Core/VideoBackends/Software/RasterFont.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2008 Dolphin Emulator Project
-// Licensed under GPLv2+
-// Refer to the license.txt file included.
-
-#pragma once
-
-class RasterFont
-{
-public:
- RasterFont();
- ~RasterFont();
- static int debug;
-
- // and the happy helper functions
- void printString(const char *s, double x, double y, double z=0.0);
- void printCenteredString(const char *s, double y, int screen_width, double z=0.0);
-
- void printMultilineText(const char *text, double x, double y, double z, int bbWidth, int bbHeight);
-
-private:
- int fontOffset;
- char *temp_buffer;
-
- static const int TEMP_BUFFER_SIZE = 64 * 1024;
- static const int CHAR_WIDTH = 10;
- static const int CHAR_HEIGHT = 15;
-};
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();
+}
+
diff --git a/Source/Core/VideoBackends/Software/SWOGLWindow.h b/Source/Core/VideoBackends/Software/SWOGLWindow.h
new file mode 100644
index 0000000000..8be58c2e66
--- /dev/null
+++ b/Source/Core/VideoBackends/Software/SWOGLWindow.h
@@ -0,0 +1,45 @@
+// Copyright 2015 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "Common/CommonTypes.h"
+
+class SWOGLWindow
+{
+public:
+ static void Init(void* window_handle);
+ static void Shutdown();
+
+ // Will be printed on the *next* image
+ void PrintText(const std::string& text, int x, int y, u32 color);
+
+ // Image to show, will be swapped immediately
+ void ShowImage(u8* data, int stride, int width, int height, float aspect);
+
+ int PeekMessages();
+
+ static std::unique_ptr<SWOGLWindow> s_instance;
+
+private:
+ SWOGLWindow() {}
+
+ void Prepare();
+
+ struct TextData
+ {
+ std::string text;
+ int x, y;
+ u32 color;
+ };
+ std::vector<TextData> m_text;
+
+ bool m_init {false};
+
+ u32 m_image_program, m_image_texture, m_image_vao;
+};
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?
}
diff --git a/Source/Core/VideoBackends/Software/SWRenderer.h b/Source/Core/VideoBackends/Software/SWRenderer.h
index a320ea6a8b..c7cafe344a 100644
--- a/Source/Core/VideoBackends/Software/SWRenderer.h
+++ b/Source/Core/VideoBackends/Software/SWRenderer.h
@@ -22,8 +22,6 @@ namespace SWRenderer
u8* GetCurrentColorTexture();
void SwapColorTexture();
void UpdateColorTexture(EfbInterface::yuv422_packed *xfb, u32 fbWidth, u32 fbHeight);
- void DrawTexture(u8 *texture, int width, int height);
void Swap(u32 fbWidth, u32 fbHeight);
- void SwapBuffer();
}
diff --git a/Source/Core/VideoBackends/Software/SWmain.cpp b/Source/Core/VideoBackends/Software/SWmain.cpp
index ba74f320c8..7b55bb0971 100644
--- a/Source/Core/VideoBackends/Software/SWmain.cpp
+++ b/Source/Core/VideoBackends/Software/SWmain.cpp
@@ -8,9 +8,6 @@
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/StringUtil.h"
-#include "Common/GL/GLInterfaceBase.h"
-#include "Common/GL/GLUtil.h"
-#include "Common/GL/GLExtensions/GLExtensions.h"
#include "Common/Logging/LogManager.h"
#include "Core/ConfigManager.h"
@@ -26,6 +23,7 @@
#include "VideoBackends/Software/OpcodeDecoder.h"
#include "VideoBackends/Software/Rasterizer.h"
#include "VideoBackends/Software/SWCommandProcessor.h"
+#include "VideoBackends/Software/SWOGLWindow.h"
#include "VideoBackends/Software/SWRenderer.h"
#include "VideoBackends/Software/SWStatistics.h"
#include "VideoBackends/Software/SWVertexLoader.h"
@@ -81,13 +79,7 @@ bool VideoSoftware::Initialize(void *window_handle)
{
g_SWVideoConfig.Load((File::GetUserPath(D_CONFIG_IDX) + GetConfigName() + ".ini").c_str());
- InitInterface();
- GLInterface->SetMode(GLInterfaceMode::MODE_DETECT);
- if (!GLInterface->Create(window_handle, false))
- {
- INFO_LOG(VIDEO, "GLInterface::Create failed.");
- return false;
- }
+ SWOGLWindow::Init(window_handle);
InitBPMemory();
InitXFMemory();
@@ -165,31 +157,16 @@ void VideoSoftware::Shutdown()
// Do our OSD callbacks
OSD::DoCallbacks(OSD::OSD_SHUTDOWN);
- GLInterface->Shutdown();
- delete GLInterface;
- GLInterface = nullptr;
+ SWOGLWindow::Shutdown();
}
void VideoSoftware::Video_Cleanup()
{
- GLInterface->ClearCurrent();
}
// This is called after Video_Initialize() from the Core
void VideoSoftware::Video_Prepare()
{
- GLInterface->MakeCurrent();
-
- // Init extension support.
- if (!GLExtensions::Init())
- {
- ERROR_LOG(VIDEO, "GLExtensions::Init failed!Does your video card support OpenGL 2.0?");
- return;
- }
-
- // Handle VSync on/off
- GLInterface->SwapInterval(VSYNC_ENABLED);
-
// Do our OSD callbacks
OSD::DoCallbacks(OSD::OSD_INIT);
@@ -367,7 +344,7 @@ void VideoSoftware::RegisterCPMMIO(MMIO::Mapping* mmio, u32 base)
// Draw messages on top of the screen
unsigned int VideoSoftware::PeekMessages()
{
- return GLInterface->PeekMessages();
+ return SWOGLWindow::s_instance->PeekMessages();
}
}
diff --git a/Source/Core/VideoBackends/Software/Software.vcxproj b/Source/Core/VideoBackends/Software/Software.vcxproj
index 8874bce821..edf569db32 100644
--- a/Source/Core/VideoBackends/Software/Software.vcxproj
+++ b/Source/Core/VideoBackends/Software/Software.vcxproj
@@ -42,11 +42,11 @@
<ClCompile Include="EfbCopy.cpp" />
<ClCompile Include="EfbInterface.cpp" />
<ClCompile Include="OpcodeDecoder.cpp" />
- <ClCompile Include="RasterFont.cpp" />
<ClCompile Include="Rasterizer.cpp" />
<ClCompile Include="SetupUnit.cpp" />
<ClCompile Include="SWCommandProcessor.cpp" />
<ClCompile Include="SWmain.cpp" />
+ <ClCompile Include="SWOGLWindow.cpp" />
<ClCompile Include="SWRenderer.cpp" />
<ClCompile Include="SWStatistics.cpp" />
<ClCompile Include="SWVertexLoader.cpp" />
@@ -66,10 +66,10 @@
<ClInclude Include="EfbInterface.h" />
<ClInclude Include="NativeVertexFormat.h" />
<ClInclude Include="OpcodeDecoder.h" />
- <ClInclude Include="RasterFont.h" />
<ClInclude Include="Rasterizer.h" />
<ClInclude Include="SetupUnit.h" />
<ClInclude Include="SWCommandProcessor.h" />
+ <ClInclude Include="SWOGLWindow.h" />
<ClInclude Include="SWRenderer.h" />
<ClInclude Include="SWStatistics.h" />
<ClInclude Include="SWVertexLoader.h" />