Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/wined3d/adapter_gl.c | 16 +++++++++++----- dlls/wined3d/wined3d_main.c | 31 +++++++++++++++++++++++++------ dlls/wined3d/wined3d_private.h | 10 +++++++++- 3 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index acfed24b53d4..803ebda37556 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -1983,22 +1983,28 @@ static const struct fragment_pipeline *select_fragment_implementation(const stru
static const struct wined3d_shader_backend_ops *select_shader_backend(const struct wined3d_gl_info *gl_info) { - BOOL glsl = wined3d_settings.use_glsl && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20); - if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT] && !wined3d_settings.use_glsl) + BOOL glsl = wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_AUTO + || wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_GLSL; + BOOL arb = wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_AUTO + || wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_ARB; + + if (!gl_info->supported[WINED3D_GL_LEGACY_CONTEXT] && !glsl) { - ERR_(winediag)("Ignoring the UseGLSL registry key. " + ERR_(winediag)("Ignoring the shader backend registry key. " "GLSL is the only shader backend available on core profile contexts. " "You need to explicitly set GL version to use legacy contexts.\n"); glsl = TRUE; }
+ glsl = glsl && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20); + if (glsl && gl_info->supported[ARB_VERTEX_SHADER] && gl_info->supported[ARB_FRAGMENT_SHADER]) return &glsl_shader_backend; - if (gl_info->supported[ARB_VERTEX_PROGRAM] && gl_info->supported[ARB_FRAGMENT_PROGRAM]) + if (arb && gl_info->supported[ARB_VERTEX_PROGRAM] && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arb_program_shader_backend; if (glsl && (gl_info->supported[ARB_VERTEX_SHADER] || gl_info->supported[ARB_FRAGMENT_SHADER])) return &glsl_shader_backend; - if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_FRAGMENT_PROGRAM]) + if (arb && (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_FRAGMENT_PROGRAM])) return &arb_program_shader_backend; return &none_shader_backend; } diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index ca83d0ae0d96..1b64d2cf5dc4 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -74,7 +74,6 @@ struct wined3d_settings wined3d_settings = { TRUE, /* Multithreaded CS by default. */ MAKEDWORD_VERSION(4, 4), /* Default to OpenGL 4.4 */ - TRUE, /* Use of GLSL enabled by default */ ORM_FBO, /* Use FBOs to do offscreen rendering */ PCI_VENDOR_NONE,/* PCI Vendor ID */ PCI_DEVICE_NONE,/* PCI Device ID */ @@ -90,6 +89,7 @@ struct wined3d_settings wined3d_settings = ~0U, /* No PS shader model limit by default. */ ~0u, /* No CS shader model limit by default. */ FALSE, /* 3D support enabled by default. */ + WINED3D_SHADER_BACKEND_AUTO, };
struct wined3d * CDECL wined3d_create(DWORD flags) @@ -218,14 +218,33 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) tmpvalue >> 16, tmpvalue & 0xffff); wined3d_settings.max_gl_version = tmpvalue; } - if ( !get_config_key( hkey, appkey, "UseGLSL", buffer, size) ) + if (!get_config_key(hkey, appkey, "ShaderBackend", buffer, size)) { - if (!strcmp(buffer,"disabled")) + if (!strcasecmp(buffer, "glsl")) { - ERR_(winediag)("The GLSL shader backend has been disabled. You get to keep all the pieces if it breaks.\n"); - TRACE("Use of GL Shading Language disabled.\n"); - wined3d_settings.use_glsl = FALSE; + ERR_(winediag)("Using the GLSL shader backend.\n"); + wined3d_settings.shader_backend = WINED3D_SHADER_BACKEND_GLSL; } + else if (!strcasecmp(buffer, "arb")) + { + ERR_(winediag)("Using the ARB shader backend.\n"); + wined3d_settings.shader_backend = WINED3D_SHADER_BACKEND_ARB; + } + else if (!strcasecmp(buffer, "none")) + { + ERR_(winediag)("Disabling shader backends.\n"); + wined3d_settings.shader_backend = WINED3D_SHADER_BACKEND_NONE; + } + } + else if (!get_config_key(hkey, appkey, "UseGLSL", buffer, size) && !strcmp(buffer, "disabled")) + { + wined3d_settings.shader_backend = WINED3D_SHADER_BACKEND_ARB; + } + if (wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_ARB + || wined3d_settings.shader_backend == WINED3D_SHADER_BACKEND_NONE) + { + ERR_(winediag)("The GLSL shader backend has been disabled. You get to keep all the pieces if it breaks.\n"); + TRACE("Use of GL Shading Language disabled.\n"); } if (!get_config_key(hkey, appkey, "OffscreenRenderingMode", buffer, size) && !strcmp(buffer,"backbuffer")) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index cd49789c1b3d..b3f3847045dd 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -375,13 +375,20 @@ static inline void wined3d_pause(void) #define PCI_VENDOR_NONE 0xffff /* e.g. 0x8086 for Intel and 0x10de for Nvidia */ #define PCI_DEVICE_NONE 0xffff /* e.g. 0x14f for a Geforce6200 */
+enum wined3d_shader_backend +{ + WINED3D_SHADER_BACKEND_AUTO, + WINED3D_SHADER_BACKEND_GLSL, + WINED3D_SHADER_BACKEND_ARB, + WINED3D_SHADER_BACKEND_NONE, +}; + /* NOTE: When adding fields to this structure, make sure to update the default * values in wined3d_main.c as well. */ struct wined3d_settings { unsigned int cs_multithreaded; DWORD max_gl_version; - BOOL use_glsl; int offscreen_rendering_mode; unsigned short pci_vendor_id; unsigned short pci_device_id; @@ -398,6 +405,7 @@ struct wined3d_settings unsigned int max_sm_ps; unsigned int max_sm_cs; BOOL no_3d; + enum wined3d_shader_backend shader_backend; };
extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN;