Henri Verbeet : wined3d: Select the shader backend during adapter initialization.

Alexandre Julliard julliard at winehq.org
Tue Feb 2 10:45:30 CST 2010


Module: wine
Branch: master
Commit: cee8e9d88189e291e0e45524122f5d5dff594c7b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cee8e9d88189e291e0e45524122f5d5dff594c7b

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Feb  2 12:06:57 2010 +0100

wined3d: Select the shader backend during adapter initialization.

---

 dlls/wined3d/device.c          |    2 +-
 dlls/wined3d/directx.c         |   22 ++++++++++++++--------
 dlls/wined3d/utils.c           |   10 ----------
 dlls/wined3d/wined3d_private.h |    3 +--
 4 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1bec60c..56e970d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6924,7 +6924,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
     for (i = 0; i < PATCHMAP_SIZE; ++i) list_init(&device->patches[i]);
 
     select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
-    device->shader_backend = select_shader_backend(adapter, device_type);
+    device->shader_backend = adapter->shader_backend;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
     device->shader_backend->shader_get_caps(device_type, &adapter->gl_info, &shader_caps);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5cb633d..c9d3f90 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1645,6 +1645,16 @@ static const struct fragment_pipeline *select_fragment_implementation(struct win
     else return &ffp_fragment_pipeline;
 }
 
+static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter)
+{
+    int vs_selected_mode, ps_selected_mode;
+
+    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
+    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
+    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
+    return &none_shader_backend;
+}
+
 /* Context activation is done by the caller. */
 static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
 {
@@ -2084,6 +2094,7 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
     LEAVE_GL();
 
     adapter->fragment_pipe = select_fragment_implementation(adapter);
+    adapter->shader_backend = select_shader_backend(adapter);
 
     /* In some cases the number of texture stages can be larger than the number
      * of samplers. The GF4 for example can use only 2 samplers (no fragment
@@ -2990,7 +3001,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
 {
     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-    const shader_backend_t *shader_backend;
 
     switch (format_desc->format)
     {
@@ -3068,8 +3078,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             /* Ask the shader backend if it can deal with the conversion. If
              * we've got a GL extension giving native support this will be an
              * identity conversion. */
-            shader_backend = select_shader_backend(adapter, DeviceType);
-            if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
+            if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup))
             {
                 TRACE_(d3d_caps)("[OK]\n");
                 return TRUE;
@@ -3185,8 +3194,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
             if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC]
                     || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC])
             {
-                shader_backend = select_shader_backend(adapter, DeviceType);
-                if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
+                if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)
                         && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
                 {
                     TRACE_(d3d_caps)("[OK]\n");
@@ -3826,7 +3834,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     int ps_selected_mode;
     struct shader_caps shader_caps;
     struct fragment_caps fragment_caps;
-    const shader_backend_t *shader_backend;
     DWORD ckey_caps, blit_caps, fx_caps;
 
     TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
@@ -4203,8 +4210,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
     pCaps->VertexTextureFilterCaps           = 0;
 
     memset(&shader_caps, 0, sizeof(shader_caps));
-    shader_backend = select_shader_backend(adapter, DeviceType);
-    shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
+    adapter->shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps);
 
     memset(&fragment_caps, 0, sizeof(fragment_caps));
     adapter->fragment_pipe->get_caps(DeviceType, &adapter->gl_info, &fragment_caps);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 318d75d..5e6da24 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2841,16 +2841,6 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
     else *ps_selected = SHADER_NONE;
 }
 
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
-{
-    int vs_selected_mode, ps_selected_mode;
-
-    select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode);
-    if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend;
-    if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend;
-    return &none_shader_backend;
-}
-
 const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type)
 {
     const struct wined3d_gl_info *gl_info = &adapter->gl_info;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 038fa3f..fca1a9a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1364,6 +1364,7 @@ struct wined3d_adapter
     LUID luid;
 
     const struct fragment_pipeline *fragment_pipe;
+    const shader_backend_t *shader_backend;
 };
 
 BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
@@ -2570,8 +2571,6 @@ unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN;
 
 const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter,
         WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
-const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter,
-        WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
 void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) DECLSPEC_HIDDEN;
 
 typedef struct local_constant {




More information about the wine-cvs mailing list