[2/8] wined3d: Select the right shader backend when creating the device

H. Verbeet hverbeet at gmail.com
Mon Nov 27 13:50:43 CST 2006


Changelog:
  - Select the right shader backend when creating the device
-------------- next part --------------
---

 dlls/wined3d/directx.c         |    7 +++++++
 dlls/wined3d/drawprim.c        |   22 ++++------------------
 dlls/wined3d/wined3d_private.h |    1 +
 3 files changed, 12 insertions(+), 18 deletions(-)

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 @@ static HRESULT  WINAPI IWineD3DImpl_Crea
     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 @@ #undef BUFFER_OR_DATA
     }
 
     /* 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 @@ #undef BUFFER_OR_DATA
         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 check_fbo_status(IWineD3DDev
 
 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 @@ static void depth_blt(IWineD3DDevice *if
     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 @@ typedef struct IWineD3DDeviceImpl
     /* Selected capabilities */
     int vs_selected_mode;
     int ps_selected_mode;
+    const shader_backend_t *shader_backend;
 
     /* Optimization */
     BOOL                    modelview_valid;


More information about the wine-patches mailing list