Module: wine Branch: master Commit: cee8e9d88189e291e0e45524122f5d5dff594c7b URL: http://source.winehq.org/git/wine.git/?a=commit;h=cee8e9d88189e291e0e4552412...
Author: Henri Verbeet hverbeet@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 {