H. Verbeet : wined3d: Store the glsl program lookup table in the backend' s private data.
Alexandre Julliard
julliard at winehq.org
Wed Jul 9 06:09:59 CDT 2008
Module: wine
Branch: master
Commit: a85a5ffb1b52d24238c0416a96c7a255b21e219f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a85a5ffb1b52d24238c0416a96c7a255b21e219f
Author: H. Verbeet <hverbeet at gmail.com>
Date: Tue Jul 8 21:44:20 2008 +0200
wined3d: Store the glsl program lookup table in the backend's private data.
---
dlls/wined3d/device.c | 2 --
dlls/wined3d/glsl_shader.c | 31 ++++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 4 +---
3 files changed, 17 insertions(+), 20 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 74bb676..3f94a3f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -173,8 +173,6 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->dst_fbo));
}
- if (This->glsl_program_lookup) hash_table_destroy(This->glsl_program_lookup);
-
/* TODO: Clean up all the surfaces and textures! */
/* NOTE: You must release the parent if the object was created via a callback
** ***************************/
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 6e21f17..070aecb 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2782,35 +2782,33 @@ void pshader_glsl_input_pack(
* Vertex Shader Specific Code begins here
********************************************/
-static void add_glsl_program_entry(IWineD3DDeviceImpl *device, struct glsl_shader_prog_link *entry) {
+static void add_glsl_program_entry(struct shader_glsl_priv *priv, struct glsl_shader_prog_link *entry) {
glsl_program_key_t *key;
key = HeapAlloc(GetProcessHeap(), 0, sizeof(glsl_program_key_t));
key->vshader = entry->vshader;
key->pshader = entry->pshader;
- hash_table_put(device->glsl_program_lookup, key, entry);
+ hash_table_put(priv->glsl_program_lookup, key, entry);
}
-static struct glsl_shader_prog_link *get_glsl_program_entry(IWineD3DDeviceImpl *device,
+static struct glsl_shader_prog_link *get_glsl_program_entry(struct shader_glsl_priv *priv,
GLhandleARB vshader, GLhandleARB pshader) {
glsl_program_key_t key;
key.vshader = vshader;
key.pshader = pshader;
- return (struct glsl_shader_prog_link *)hash_table_get(device->glsl_program_lookup, &key);
+ return (struct glsl_shader_prog_link *)hash_table_get(priv->glsl_program_lookup, &key);
}
-void delete_glsl_program_entry(IWineD3DDevice *iface, struct glsl_shader_prog_link *entry) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
+void delete_glsl_program_entry(struct shader_glsl_priv *priv, WineD3D_GL_Info *gl_info, struct glsl_shader_prog_link *entry) {
glsl_program_key_t *key;
key = HeapAlloc(GetProcessHeap(), 0, sizeof(glsl_program_key_t));
key->vshader = entry->vshader;
key->pshader = entry->pshader;
- hash_table_remove(This->glsl_program_lookup, key);
+ hash_table_remove(priv->glsl_program_lookup, key);
GL_EXTCALL(glDeleteObjectARB(entry->programId));
if (entry->vshader) list_remove(&entry->vshader_entry);
@@ -3158,7 +3156,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
GLhandleARB vshader_id = use_vs ? ((IWineD3DBaseShaderImpl*)vshader)->baseShader.prgId : 0;
GLhandleARB pshader_id = use_ps ? ((IWineD3DBaseShaderImpl*)pshader)->baseShader.prgId : 0;
- entry = get_glsl_program_entry(This, vshader_id, pshader_id);
+ entry = get_glsl_program_entry(priv, vshader_id, pshader_id);
if (entry) {
priv->glsl_program = entry;
return;
@@ -3174,7 +3172,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
entry->vshader = vshader_id;
entry->pshader = pshader_id;
/* Add the hash table entry */
- add_glsl_program_entry(This, entry);
+ add_glsl_program_entry(priv, entry);
/* Set the current program */
priv->glsl_program = entry;
@@ -3420,7 +3418,9 @@ static void shader_glsl_cleanup(IWineD3DDevice *iface) {
static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
struct list *linked_programs;
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) iface;
- WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *) This->baseShader.device)->adapter->gl_info;
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device;
+ struct shader_glsl_priv *priv = (struct shader_glsl_priv *)device->shader_priv;
+ WineD3D_GL_Info *gl_info = &device->adapter->gl_info;
/* Note: Do not use QueryInterface here to find out which shader type this is because this code
* can be called from IWineD3DBaseShader::Release
@@ -3436,11 +3436,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
if(pshader) {
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, linked_programs, struct glsl_shader_prog_link, pshader_entry) {
- delete_glsl_program_entry(This->baseShader.device, entry);
+ delete_glsl_program_entry(priv, gl_info, entry);
}
} else {
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, linked_programs, struct glsl_shader_prog_link, vshader_entry) {
- delete_glsl_program_entry(This->baseShader.device, entry);
+ delete_glsl_program_entry(priv, gl_info, entry);
}
}
}
@@ -3475,8 +3475,9 @@ static BOOL glsl_program_key_compare(void *keya, void *keyb) {
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);
+ struct shader_glsl_priv *priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_glsl_priv));
+ priv->glsl_program_lookup = hash_table_create(glsl_program_key_hash, glsl_program_key_compare);
+ This->shader_priv = priv;
return WINED3D_OK;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b6377d3..cb019c7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -310,6 +310,7 @@ extern const shader_backend_t none_shader_backend;
/* GLSL shader private data */
struct shader_glsl_priv {
+ hash_table_t *glsl_program_lookup;
struct glsl_shader_prog_link *glsl_program;
GLhandleARB depth_blt_glsl_program_id;
};
@@ -824,7 +825,6 @@ struct IWineD3DDeviceImpl
int vs_selected_mode;
int ps_selected_mode;
const shader_backend_t *shader_backend;
- hash_table_t *glsl_program_lookup;
void *shader_priv;
struct StateEntry StateTable[STATE_HIGHEST + 1];
/* Array of functions for states which are handled by more than one pipeline part */
@@ -1991,8 +1991,6 @@ extern const SHADER_OPCODE* shader_get_opcode(
IWineD3DBaseShader *iface,
const DWORD code);
-void delete_glsl_program_entry(IWineD3DDevice *iface, struct glsl_shader_prog_link *entry);
-
/* Vertex shader utility functions */
extern BOOL vshader_get_input(
IWineD3DVertexShader* iface,
More information about the wine-cvs
mailing list