Stefan Dösinger : wined3d: Move the shader backend selection into a separate function.
Alexandre Julliard
julliard at winehq.org
Tue Mar 25 14:19:51 CDT 2008
Module: wine
Branch: master
Commit: 6d5f562dcf951471567d5d32de3da7f24312c28a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d5f562dcf951471567d5d32de3da7f24312c28a
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Tue Mar 18 19:37:53 2008 +0100
wined3d: Move the shader backend selection into a separate function.
---
dlls/wined3d/directx.c | 47 +++++++++++++++----------------------------
dlls/wined3d/glsl_shader.c | 22 ++++++++++++++++++++
2 files changed, 39 insertions(+), 30 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index ef6b6df..20b2c11 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2638,6 +2638,22 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface,
return WINED3D_OK;
}
+static const shader_backend_t *select_shader_backend(UINT Adapter, WINED3DDEVTYPE DeviceType) {
+ const shader_backend_t *ret;
+ int vs_selected_mode;
+ int ps_selected_mode;
+
+ select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode);
+ if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) {
+ ret = &glsl_shader_backend;
+ } else if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) {
+ ret = &arb_program_shader_backend;
+ } else {
+ ret = &none_shader_backend;
+ }
+ return ret;
+}
+
/* Note: d3d8 passes in a pointer to a D3DCAPS8 structure, which is a true
subset of a D3DCAPS9 structure. However, it has to come via a void *
as the d3d8 interface cannot import the d3d9 header */
@@ -3221,27 +3237,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
return WINED3D_OK;
}
-static unsigned int glsl_program_key_hash(void *key) {
- glsl_program_key_t *k = (glsl_program_key_t *)key;
-
- unsigned int hash = k->vshader | k->pshader << 16;
- hash += ~(hash << 15);
- hash ^= (hash >> 10);
- hash += (hash << 3);
- hash ^= (hash >> 6);
- hash += ~(hash << 11);
- hash ^= (hash >> 16);
-
- return hash;
-}
-
-static BOOL glsl_program_key_compare(void *keya, void *keyb) {
- glsl_program_key_t *ka = (glsl_program_key_t *)keya;
- glsl_program_key_t *kb = (glsl_program_key_t *)keyb;
-
- return ka->vshader == kb->vshader && ka->pshader == kb->pshader;
-}
-
/* Note due to structure differences between dx8 and dx9 D3DPRESENT_PARAMETERS,
and fields being inserted in the middle, a new structure is used in place */
static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, HWND hFocusWindow,
@@ -3302,15 +3297,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
object->devType = DeviceType;
select_shader_mode(&GLINFO_LOCATION, 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;
- object->glsl_program_lookup = hash_table_create(&glsl_program_key_hash, &glsl_program_key_compare);
- } 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;
- }
- if(FAILED(object->shader_backend->shader_alloc_private((IWineD3DDevice *) object))) {
+ object->shader_backend = select_shader_backend(Adapter, DeviceType); if(FAILED(object->shader_backend->shader_alloc_private((IWineD3DDevice *) object))) {
IWineD3D_Release(object->wineD3D);
HeapFree(GetProcessHeap(), 0, object);
*ppReturnedDeviceInterface = NULL;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 293a310..d7b609d 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -3346,9 +3346,31 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
This->baseShader.is_compiled = FALSE;
}
+static unsigned int glsl_program_key_hash(void *key) {
+ glsl_program_key_t *k = (glsl_program_key_t *)key;
+
+ unsigned int hash = k->vshader | k->pshader << 16;
+ hash += ~(hash << 15);
+ hash ^= (hash >> 10);
+ hash += (hash << 3);
+ hash ^= (hash >> 6);
+ hash += ~(hash << 11);
+ hash ^= (hash >> 16);
+
+ return hash;
+}
+
+static BOOL glsl_program_key_compare(void *keya, void *keyb) {
+ glsl_program_key_t *ka = (glsl_program_key_t *)keya;
+ glsl_program_key_t *kb = (glsl_program_key_t *)keyb;
+
+ return ka->vshader == kb->vshader && ka->pshader == kb->pshader;
+}
+
static HRESULT shader_glsl_alloc(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
This->shader_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_glsl_priv));
+ This->glsl_program_lookup = hash_table_create(&glsl_program_key_hash, &glsl_program_key_compare);
return WINED3D_OK;
}
More information about the wine-cvs
mailing list