gsdx: RendererEnum

1. Add GS_Renderer Enum

Replace all instances of int/uint32 renderer identifier by a strongly
typed enum and appropriate casts.

Only instances in GS[*].cpp/h classes were touched. GPU[*].cpp/h classes
do not to follow the same convention.

2. Add default renderer according to OS

The default renderer is OS dependent (Win -> Dx9HW, others -> OGLHW).
Consequently one should always check againt the appropriate default
value on config load.

The old behaviour was only - if a at all - problematic if the respective
element in the gsdx.ini was missing and probably even then didn't create
issues. The current implementation is still more stable and does not
depend on the implementation of GS.cpp -> GetConfig()
This commit is contained in:
willkuer 2015-10-26 22:30:34 +01:00
parent 321193cf44
commit 9245d3ed7e
6 changed files with 183 additions and 114 deletions

View File

@ -62,7 +62,7 @@ extern bool RunLinuxDialog();
static GSRenderer* s_gs = NULL;
static void (*s_irq)() = NULL;
static uint8* s_basemem = NULL;
static int s_renderer = -1;
static GSRendererType s_renderer = GSRendererType::Undefined;
static bool s_framelimit = true;
static bool s_vsync = false;
static bool s_exclusive = true;
@ -146,7 +146,7 @@ EXPORT_C GSshutdown()
s_gs = NULL;
s_renderer = -1;
s_renderer = GSRendererType::Undefined;
#ifdef _WINDOWS
@ -180,13 +180,13 @@ EXPORT_C GSclose()
}
}
static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
static int _GSopen(void** dsp, char* title, GSRendererType renderer, int threads = -1)
{
GSDevice* dev = NULL;
if(renderer == -1)
if(renderer == GSRendererType::Undefined)
{
renderer = theApp.GetConfig("Renderer", 0);
renderer = static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)));
}
if(threads == -1)
@ -211,13 +211,21 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
switch (renderer)
{
case 1: case 4: case 10: case 13:
case GSRendererType::DX9_SW:
case GSRendererType::DX1011_SW:
case GSRendererType::Null_SW:
case GSRendererType::OGL_SW:
s_type_log = "(Software mode)";
break;
case 2: case 5: case 11:
case GSRendererType::DX9_Null:
case GSRendererType::DX1011_Null:
case GSRendererType::Null_Null:
s_type_log = "(Null mode)";
break;
case 14: case 15: case 16: case 17:
case GSRendererType::DX9_OpenCL:
case GSRendererType::DX1011_OpenCL:
case GSRendererType::Null_OpenCL:
case GSRendererType::OGL_OpenCL:
s_type_log = "(OpenCL)";
break;
default:
@ -229,21 +237,32 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
{
default:
#ifdef _WINDOWS
case 0: case 1: case 2: case 14:
case GSRendererType::DX9_HW:
case GSRendererType::DX9_SW:
case GSRendererType::DX9_Null:
case GSRendererType::DX9_OpenCL:
dev = new GSDevice9();
s_renderer_name = " D3D9";
printf("\n Current Renderer: Direct3D9%s \n", s_type_log);
break;
case 3: case 4: case 5: case 15:
case GSRendererType::DX1011_HW:
case GSRendererType::DX1011_SW:
case GSRendererType::DX1011_Null:
case GSRendererType::DX1011_OpenCL:
dev = new GSDevice11();
s_renderer_name = " D3D11";
printf("\n Current Renderer: Direct3D11%s \n", s_type_log);
break;
#endif
case 9: case 10: case 11: case 16:
case GSRendererType::Null_HW:
case GSRendererType::Null_SW:
case GSRendererType::Null_Null:
case GSRendererType::Null_OpenCL:
dev = new GSDeviceNull();
break;
case 12: case 13: case 17:
case GSRendererType::OGL_HW:
case GSRendererType::OGL_SW:
case GSRendererType::OGL_OpenCL:
dev = new GSDeviceOGL();
s_renderer_name = " OGL";
printf("\n Current Renderer: OpenGL%s \n", s_type_log);
@ -261,28 +280,36 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
{
default:
#ifdef _WINDOWS
case 0:
case GSRendererType::DX9_HW:
s_gs = (GSRenderer*)new GSRendererDX9();
s_renderer_type = " HW";
break;
case 3:
case GSRendererType::DX1011_HW:
s_gs = (GSRenderer*)new GSRendererDX11();
s_renderer_type = " HW";
break;
#endif
case 12:
case GSRendererType::OGL_HW:
s_gs = (GSRenderer*)new GSRendererOGL();
s_renderer_type = " HW";
break;
case 1: case 4: case 10: case 13:
case GSRendererType::DX9_SW:
case GSRendererType::DX1011_SW:
case GSRendererType::Null_SW:
case GSRendererType::OGL_SW:
s_gs = new GSRendererSW(threads);
s_renderer_type = " SW";
break;
case 2: case 5: case 11:
case GSRendererType::DX9_Null:
case GSRendererType::DX1011_Null:
case GSRendererType::Null_Null:
s_gs = new GSRendererNull();
s_renderer_type = " Null";
break;
case 14: case 15: case 16: case 17:
case GSRendererType::DX9_OpenCL:
case GSRendererType::DX1011_OpenCL:
case GSRendererType::Null_OpenCL:
case GSRendererType::OGL_OpenCL:
#ifdef ENABLE_OPENCL
s_gs = new GSRendererCL();
s_renderer_type = " OCL";
@ -302,7 +329,9 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
#ifdef _WINDOWS
switch (renderer)
{
case 12: case 13: case 17:
case GSRendererType::OGL_HW:
case GSRendererType::OGL_SW:
case GSRendererType::OGL_OpenCL:
s_gs->m_wnd = new GSWndWGL();
break;
default:
@ -442,7 +471,7 @@ static int _GSopen(void** dsp, char* title, int renderer, int threads = -1)
return -1;
}
if (renderer == 12 && theApp.GetConfig("debug_glsl_shader", 0) == 2) {
if (renderer == GSRendererType::OGL_HW && theApp.GetConfig("debug_glsl_shader", 0) == 2) {
printf("GSdx: test OpenGL shader. Please wait...\n\n");
static_cast<GSDeviceOGL*>(s_gs->m_dev)->SelfShaderTest();
printf("\nGSdx: test OpenGL shader done. It will now exit\n");
@ -457,39 +486,37 @@ EXPORT_C_(int) GSopen2(void** dsp, uint32 flags)
static bool stored_toggle_state = false;
bool toggle_state = !!(flags & 4);
int renderer = s_renderer;
GSRendererType renderer = s_renderer;
// Fresh start up or config file changed
if (renderer == -1)
if (renderer == GSRendererType::Undefined)
{
#ifdef __linux__
// Use ogl renderer as default otherwise it crash at startup
// GSRenderOGL only GSDeviceOGL (not GSDeviceNULL)
renderer = theApp.GetConfig("Renderer", 12);
#else
renderer = theApp.GetConfig("Renderer", 0);
#endif
renderer = static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)));
}
else if (stored_toggle_state != toggle_state)
{
#ifdef _WIN32
int best_sw_renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw
GSRendererType best_sw_renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? GSRendererType::DX1011_SW : GSRendererType::DX9_SW;
switch (renderer) {
// Use alternative renderer (SW if currently using HW renderer, and vice versa, keeping the same API and API version)
case GSRendererType::DX9_SW: renderer = GSRendererType::DX9_HW; break;
case GSRendererType::DX9_HW: renderer = GSRendererType::DX9_SW; break;
case GSRendererType::DX1011_SW: renderer = GSRendererType::DX1011_HW; break;
case GSRendererType::DX1011_HW: renderer = GSRendererType::DX1011_SW; break;
case GSRendererType::OGL_SW: renderer = GSRendererType::OGL_HW; break;
case GSRendererType::OGL_HW: renderer = GSRendererType::OGL_SW; break;
default: renderer = best_sw_renderer; break;// If wasn't using one of the above mentioned ones, use best SW renderer.
switch(renderer){
// Use alternative renderer (SW if currently using HW renderer, and vice versa, keeping the same DX level)
case 1: renderer = 0; break; // DX9: SW to HW
case 0: renderer = 1; break; // DX9: HW to SW
case 4: renderer = 3; break; // DX11: SW to HW
case 3: renderer = 4; break; // DX11: HW to SW
case 13: renderer = 12; break; // OGL: SW to HW
case 12: renderer = 13; break; // OGL: HW to SW
default: renderer = best_sw_renderer; // If wasn't using DX (e.g. SDL), use best SW renderer.
}
#endif
#ifdef __linux__
switch(renderer) {
case 13: renderer = 12; break; // OGL: SW to HW
case 12: renderer = 13; break; // OGL: HW to SW
// Use alternative renderer (SW if currently using HW renderer, and vice versa)
case GSRendererType::OGL_SW: renderer = GSRendererType::OGL_HW; break;
case GSRendererType::OGL_HW: renderer = GSRendererType::OGL_SW; break;
default: renderer = GSRendererType::OGL_SW; break; // fallback to OGL SW
}
#endif
}
@ -515,7 +542,7 @@ EXPORT_C_(int) GSopen(void** dsp, char* title, int mt)
XCloseDisplay(display);
*/
int renderer = 0;
GSRendererType renderer = GSRendererType::Default;
// Legacy GUI expects to acquire vsync from the configuration files.
@ -527,7 +554,7 @@ EXPORT_C_(int) GSopen(void** dsp, char* title, int mt)
#ifdef _WINDOWS
renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw
renderer = GSUtil::CheckDirect3D11Level() >= D3D_FEATURE_LEVEL_10_0 ? GSRendererType::DX1011_SW : GSRendererType::DX9_SW;
#endif
@ -537,7 +564,7 @@ EXPORT_C_(int) GSopen(void** dsp, char* title, int mt)
{
// normal init
renderer = theApp.GetConfig("Renderer", 0);
renderer = static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)));
}
*dsp = NULL;
@ -779,7 +806,7 @@ EXPORT_C GSconfigure()
GSshutdown();
}
// Force a reload of the gs state
s_renderer = -1;
s_renderer = GSRendererType::Undefined;
}
#else
@ -787,7 +814,7 @@ EXPORT_C GSconfigure()
if (RunLinuxDialog()) {
theApp.ReloadConfig();
// Force a reload of the gs state
s_renderer = -1;
s_renderer = GSRendererType::Undefined;
}
#endif
@ -1030,13 +1057,13 @@ public:
EXPORT_C GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
int renderer = -1;
GSRendererType renderer = GSRendererType::Undefined;
{
char* start = lpszCmdLine;
char* end = NULL;
long n = strtol(lpszCmdLine, &end, 10);
if(end > start) {renderer = n; lpszCmdLine = end;}
if(end > start) {renderer = static_cast<GSRendererType>(n); lpszCmdLine = end;}
}
while(*lpszCmdLine == ' ') lpszCmdLine++;
@ -1496,11 +1523,15 @@ EXPORT_C GSReplay(char* lpszCmdLine, int renderer)
{
GLLoader::in_replayer = true;
// Allow to easyly switch between SW/HW renderer
renderer = theApp.GetConfig("Renderer", 12);
if (renderer != 12 && renderer != 13)
GSRendererType m_renderer;
// Allow to easyly switch between SW/HW renderer -> this effectively removes the ability to select the renderer by function args
m_renderer = static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)));
// alternatively:
// m_renderer = static_cast<GSRendererType>(renderer);
if (m_renderer != GSRendererType::OGL_HW && m_renderer != GSRendererType::OGL_SW)
{
fprintf(stderr, "wrong renderer selected %d\n", renderer);
fprintf(stderr, "wrong renderer selected %d\n", static_cast<int>(m_renderer));
return;
}
@ -1520,7 +1551,7 @@ EXPORT_C GSReplay(char* lpszCmdLine, int renderer)
void* hWnd = NULL;
int err = _GSopen((void**)&hWnd, "", renderer);
int err = _GSopen((void**)&hWnd, "", m_renderer);
if (err != 0) {
fprintf(stderr, "Error failed to GSopen\n");
return;

View File

@ -216,6 +216,40 @@ enum GS_AFAIL
AFAIL_RGB_ONLY = 3,
};
enum class GSRendererType : int8_t
{
Undefined = -1,
DX9_HW = 0,
DX9_SW = 1,
DX9_OpenCL = 14,
DX9_Null = 2,
DX1011_HW = 3,
DX1011_SW = 4,
DX1011_OpenCL = 15,
DX1011_Null = 5,
Null_HW = 9,
Null_SW = 10,
Null_OpenCL = 16,
Null_Null = 11,
OGL_HW = 12,
OGL_SW = 13,
OGL_OpenCL = 17,
#ifdef _WINDOWS
Default = DX9_HW
#else
// Use ogl renderer as default otherwise it crash at startup
// GSRenderOGL only GSDeviceOGL (not GSDeviceNULL)
Default = OGL_HW
#endif
};
#define REG32(name) \
union name \
{ \

View File

@ -21,6 +21,7 @@
#include "stdafx.h"
#include <gtk/gtk.h>
#include "GS.h"
#include "GSdx.h"
#include "GSLinuxLogo.h"
#include "GSSetting.h"
@ -38,17 +39,16 @@ void CB_ChangedRenderComboBox(GtkComboBox *combo, gpointer user_data)
{
if (gtk_combo_box_get_active(combo) == -1) return;
// Note the value are based on m_gs_renderers vector on GSdx.cpp
switch (gtk_combo_box_get_active(combo)) {
case 0: theApp.SetConfig("Renderer", 10); break;
case 1: theApp.SetConfig("Renderer", 16); break;
case 2: theApp.SetConfig("Renderer", 11); break;
case 3: theApp.SetConfig("Renderer", 12); break;
case 4: theApp.SetConfig("Renderer", 13); break;
case 5: theApp.SetConfig("Renderer", 17); break;
case 0: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::Null_SW)); break;
case 1: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::Null_OpenCL)); break;
case 2: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::Null_Null)); break;
case 3: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::OGL_HW)); break;
case 4: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::OGL_SW)); break;
case 5: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::OGL_OpenCL)); break;
// Fallback to SW opengl
default: theApp.SetConfig("Renderer", 13); break;
default: theApp.SetConfig("Renderer", static_cast<int>(GSRendererType::OGL_SW)); break;
}
}
@ -64,38 +64,37 @@ GtkWidget* CreateRenderComboBox()
if(!s->note.empty()) label += format(" (%s)", s->note.c_str());
// Add some tags to ease users selection
switch (s->id) {
switch (static_cast<GSRendererType>(s->id)) {
// Supported opengl
case 12:
case 13:
case 17:
break;
case GSRendererType::OGL_HW:
case GSRendererType::OGL_SW:
case GSRendererType::OGL_OpenCL:
break;
// (dev only) for any NULL stuff
case 10:
case 11:
case 16:
label += " (debug only)";
break;
case GSRendererType::Null_SW:
case GSRendererType::Null_OpenCL:
case GSRendererType::Null_Null:
label += " (debug only)";
break;
default:
continue;
default:
continue;
}
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(render_combo_box), label.c_str());
}
switch (theApp.GetConfig("Renderer", 0)) {
// Note the value are based on m_gs_renderers vector on GSdx.cpp
case 10: renderer_box_position = 0; break;
case 16: renderer_box_position = 1; break;
case 11: renderer_box_position = 2; break;
case 12: renderer_box_position = 3; break;
case 13: renderer_box_position = 4; break;
case 17: renderer_box_position = 5; break;
switch (static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)))) {
case GSRendererType::Null_SW: renderer_box_position = 0; break;
case GSRendererType::Null_OpenCL: renderer_box_position = 1; break;
case GSRendererType::Null_Null: renderer_box_position = 2; break;
case GSRendererType::OGL_HW: renderer_box_position = 3; break;
case GSRendererType::OGL_SW: renderer_box_position = 4; break;
case GSRendererType::OGL_OpenCL: renderer_box_position = 5; break;
// Fallback to openGL SW
default: renderer_box_position = 4; break;
// Fallback to openGL SW
default: renderer_box_position = 4; break;
}
gtk_combo_box_set_active(GTK_COMBO_BOX(render_combo_box), renderer_box_position);

View File

@ -356,14 +356,16 @@ void GSSettingsDlg::UpdateRenderers()
vector<GSSetting> renderers;
unsigned renderer_setting = theApp.GetConfig("Renderer", 0);
unsigned renderer_sel = 0;
GSRendererType renderer_setting = static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default)));
GSRendererType renderer_sel = GSRendererType::Default;
for(size_t i = 0; i < theApp.m_gs_renderers.size(); i++)
{
GSSetting r = theApp.m_gs_renderers[i];
if(r.id >= 3 && r.id <= 5 || r.id == 15)
GSRendererType renderer = static_cast<GSRendererType>(r.id);
if(renderer == GSRendererType::DX1011_HW || renderer == GSRendererType::DX1011_SW || renderer == GSRendererType::DX1011_Null || renderer == GSRendererType::DX1011_OpenCL)
{
if(level < D3D_FEATURE_LEVEL_10_0) continue;
@ -372,13 +374,13 @@ void GSSettingsDlg::UpdateRenderers()
renderers.push_back(r);
if(r.id == renderer_setting)
if (static_cast<GSRendererType>(r.id) == renderer_setting)
{
renderer_sel = renderer_setting;
}
}
ComboBoxInit(IDC_RENDERER, renderers, renderer_sel);
ComboBoxInit(IDC_RENDERER, renderers, static_cast<uint32>(renderer_sel));
}
void GSSettingsDlg::UpdateControls()
@ -394,13 +396,15 @@ void GSSettingsDlg::UpdateControls()
if(ComboBoxGetSelData(IDC_RENDERER, i))
{
bool dx9 = i >= 0 && i <= 2 || i == 14;
bool dx11 = i >= 3 && i <= 5 || i == 15;
bool ogl = i >= 12 && i <= 13 || i == 17;
bool hw = i == 0 || i == 3 || i == 12;
//bool sw = i == 1 || i == 4 || i == 10 || i == 13;
bool ocl = i >= 14 && i <= 17;
GSRendererType renderer = static_cast<GSRendererType>(i);
bool dx9 = renderer == GSRendererType::DX9_HW || renderer == GSRendererType::DX9_SW || renderer == GSRendererType::DX9_Null || renderer == GSRendererType::DX9_OpenCL;
bool dx11 = renderer == GSRendererType::DX1011_HW || renderer == GSRendererType::DX1011_SW || renderer == GSRendererType::DX1011_Null || renderer == GSRendererType::DX1011_OpenCL;
bool ogl = renderer == GSRendererType::OGL_HW || renderer == GSRendererType::OGL_SW || renderer == GSRendererType::OGL_OpenCL;
bool hw = renderer == GSRendererType::DX9_HW || renderer == GSRendererType::DX1011_HW || renderer == GSRendererType::OGL_HW || renderer == GSRendererType::Null_HW;
//bool sw = renderer == GSRendererType::DX9_SW || renderer == GSRendererType::DX1011_SW || renderer == GSRendererType::OGL_SW || renderer == GSRendererType::Null_SW
bool ocl = renderer == GSRendererType::DX9_OpenCL || renderer == GSRendererType::DX1011_OpenCL || renderer == GSRendererType::Null_OpenCL || renderer == GSRendererType::OGL_OpenCL;
ShowWindow(GetDlgItem(m_hWnd, IDC_LOGO9), dx9 ? SW_SHOW : SW_HIDE);
ShowWindow(GetDlgItem(m_hWnd, IDC_LOGO11), dx11 ? SW_SHOW : SW_HIDE);
@ -580,11 +584,11 @@ GSHacksDlg::GSHacksDlg() :
void GSHacksDlg::OnInit()
{
HWND hwnd_renderer = GetDlgItem(GetParent(m_hWnd), IDC_RENDERER);
int renderer = SendMessage(hwnd_renderer, CB_GETITEMDATA, SendMessage(hwnd_renderer, CB_GETCURSEL, 0, 0), 0);
GSRendererType renderer = static_cast<GSRendererType>(SendMessage(hwnd_renderer, CB_GETITEMDATA, SendMessage(hwnd_renderer, CB_GETCURSEL, 0, 0), 0));
// It can only be accessed with a HW renderer, so this is sufficient.
bool dx9 = renderer == 0;
// bool dx11 = renderer == 3;
bool ogl = renderer == 12;
bool dx9 = renderer == GSRendererType::DX9_HW;
// bool dx11 = renderer == GSRendererType::DX1011_HW;
bool ogl = renderer == GSRendererType::OGL_HW;
unsigned short cb = 0;
if(dx9) for(unsigned short i = 0; i < 17; i++)

View File

@ -27,14 +27,14 @@ bool s_IS_OPENGL = false;
GSTextureCache::GSTextureCache(GSRenderer* r)
: m_renderer(r)
{
s_IS_OPENGL = (theApp.GetConfig("Renderer", 12) == 12);
s_IS_OPENGL = (static_cast<GSRendererType>(theApp.GetConfig("Renderer", static_cast<int>(GSRendererType::Default))) == GSRendererType::OGL_HW);
m_spritehack = !!theApp.GetConfig("UserHacks", 0) ? theApp.GetConfig("UserHacks_SpriteHack", 0) : 0;
UserHacks_HalfPixelOffset = !!theApp.GetConfig("UserHacks", 0) && !!theApp.GetConfig("UserHacks_HalfPixelOffset", 0);
m_paltex = !!theApp.GetConfig("paltex", 0);
m_preload_frame = theApp.GetConfig("preload_frame_with_gs_data", 0);
m_can_convert_depth = theApp.GetConfig("Renderer", 12) == 12 ? theApp.GetConfig("texture_cache_depth", 1) : 0;
m_can_convert_depth = s_IS_OPENGL ? theApp.GetConfig("texture_cache_depth", 1) : 0;
m_crc_hack_level = theApp.GetConfig("crc_hack_level", 3);
m_temp = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32);

View File

@ -21,6 +21,7 @@
#include "stdafx.h"
#include "GSdx.h"
#include "GS.h"
static void* s_hModule;
@ -127,20 +128,20 @@ GSdxApp::GSdxApp()
m_ini = "inis/GSdx.ini";
m_section = "Settings";
m_gs_renderers.push_back(GSSetting(0, "Direct3D9", "Hardware"));
m_gs_renderers.push_back(GSSetting(1, "Direct3D9", "Software"));
m_gs_renderers.push_back(GSSetting(14, "Direct3D9", "OpenCL"));
m_gs_renderers.push_back(GSSetting(2, "Direct3D9", "Null"));
m_gs_renderers.push_back(GSSetting(3, "Direct3D", "Hardware"));
m_gs_renderers.push_back(GSSetting(4, "Direct3D", "Software"));
m_gs_renderers.push_back(GSSetting(15, "Direct3D", "OpenCL"));
m_gs_renderers.push_back(GSSetting(5, "Direct3D", "Null"));
m_gs_renderers.push_back(GSSetting(10, "Null", "Software"));
m_gs_renderers.push_back(GSSetting(16, "Null", "OpenCL"));
m_gs_renderers.push_back(GSSetting(11, "Null", "Null"));
m_gs_renderers.push_back(GSSetting(12, "OpenGL", "Hardware"));
m_gs_renderers.push_back(GSSetting(13, "OpenGL", "Software"));
m_gs_renderers.push_back(GSSetting(17, "OpenGL", "OpenCL"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX9_HW), "Direct3D9", "Hardware"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX9_SW), "Direct3D9", "Software"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX9_OpenCL), "Direct3D9", "OpenCL"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX9_Null), "Direct3D9", "Null"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX1011_HW), "Direct3D", "Hardware"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX1011_SW), "Direct3D", "Software"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX1011_OpenCL), "Direct3D", "OpenCL"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX1011_Null), "Direct3D", "Null"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::Null_SW), "Null", "Software"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::Null_OpenCL), "Null", "OpenCL"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::Null_Null), "Null", "Null"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_HW), "OpenGL", "Hardware"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_SW), "OpenGL", "Software"));
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_OpenCL), "OpenGL", "OpenCL"));
m_gs_interlace.push_back(GSSetting(0, "None", ""));
m_gs_interlace.push_back(GSSetting(1, "Weave tff", "saw-tooth"));