wined3d: Select the right shader backend when creating the device.
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 368f384..5fc22d6 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c
@@ -2438,6 +2438,13 @@ IWineD3DImpl_FillGLCaps(iface, IWineD3DImpl_GetAdapterDisplay(iface, Adapter)); LEAVE_GL(); select_shader_mode(&This->gl_info, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode); + if (object->ps_selected_mode == SHADER_GLSL || object->vs_selected_mode == SHADER_GLSL) { + object->shader_backend = &glsl_shader_backend; + } else if (object->ps_selected_mode == SHADER_ARB || object->vs_selected_mode == SHADER_ARB) { + object->shader_backend = &arb_program_shader_backend; + } else { + object->shader_backend = &none_shader_backend; + } /* This function should *not* be modifying GL caps * TODO: move the functionality where it belongs */
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 0c708c3..05e8f78 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c
@@ -1802,18 +1802,10 @@ } /* Make any shaders active */ - if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) { - glsl_shader_backend.shader_select(iface, usePixelShaderFunction, useVertexShaderFunction); - } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) { - arb_program_shader_backend.shader_select(iface, usePixelShaderFunction, useVertexShaderFunction); - } + This->shader_backend->shader_select(iface, usePixelShaderFunction, useVertexShaderFunction); /* Load any global constants/uniforms that may have been set by the application */ - if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) { - glsl_shader_backend.shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction); - } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) { - arb_program_shader_backend.shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction); - } + This->shader_backend->shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction); /* Draw vertex-by-vertex */ if (useDrawStridedSlow) @@ -1822,11 +1814,7 @@ drawStridedFast(iface, numberOfIndicies, glPrimType, idxData, idxSize, minIndex, StartIdx); /* Cleanup any shaders */ - if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) { - glsl_shader_backend.shader_cleanup(usePixelShaderFunction, useVertexShaderFunction); - } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) { - arb_program_shader_backend.shader_cleanup(usePixelShaderFunction, useVertexShaderFunction); - } + This->shader_backend->shader_cleanup(usePixelShaderFunction, useVertexShaderFunction); /* Unload vertex data */ if (useVertexShaderFunction) { @@ -2046,7 +2034,6 @@ static void depth_blt(IWineD3DDevice *iface, GLuint texture) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - BOOL glsl_mode = This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL; glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT); @@ -2061,8 +2048,7 @@ glBindTexture(GL_TEXTURE_2D, texture); glEnable(GL_TEXTURE_2D); - if (glsl_mode) glsl_shader_backend.shader_select_depth_blt(iface); - else arb_program_shader_backend.shader_select_depth_blt(iface); + This->shader_backend->shader_select_depth_blt(iface); glBegin(GL_TRIANGLE_STRIP); glVertex2f(-1.0f, -1.0f);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 8db15e0..0776767 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h
@@ -515,6 +515,7 @@ /* Selected capabilities */ int vs_selected_mode; int ps_selected_mode; + const shader_backend_t *shader_backend; /* Optimization */ BOOL modelview_valid;