[PATCH 5/5] wined3d: Merge the glsl_vshader_private and glsl_pshader_private structures.
Henri Verbeet
hverbeet at codeweavers.com
Wed Sep 19 14:50:23 CDT 2012
---
dlls/wined3d/glsl_shader.c | 155 ++++++++++++++++++++------------------------
1 files changed, 70 insertions(+), 85 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index aece4d0..3759709 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -144,22 +144,20 @@ struct glsl_ps_compiled_shader
GLhandleARB prgId;
};
-struct glsl_pshader_private
-{
- struct glsl_ps_compiled_shader *gl_shaders;
- UINT num_gl_shaders, shader_array_size;
-};
-
struct glsl_vs_compiled_shader
{
struct vs_compile_args args;
GLhandleARB prgId;
};
-struct glsl_vshader_private
+struct glsl_shader_private
{
- struct glsl_vs_compiled_shader *gl_shaders;
- UINT num_gl_shaders, shader_array_size;
+ union
+ {
+ struct glsl_vs_compiled_shader *vs;
+ struct glsl_ps_compiled_shader *ps;
+ } gl_shaders;
+ UINT num_gl_shaders, shader_array_size;
};
static const char *debug_gl_shader_type(GLenum type)
@@ -4192,11 +4190,11 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
const struct ps_compile_args *args, const struct ps_np2fixup_info **np2fixup_info)
{
struct wined3d_state *state = &shader->device->stateBlock->state;
+ struct glsl_ps_compiled_shader *gl_shaders, *new_array;
+ struct glsl_shader_private *shader_data;
+ struct ps_np2fixup_info *np2fixup;
UINT i;
DWORD new_size;
- struct glsl_ps_compiled_shader *new_array;
- struct glsl_pshader_private *shader_data;
- struct ps_np2fixup_info *np2fixup = NULL;
GLhandleARB ret;
if (!shader->backend_data)
@@ -4209,6 +4207,7 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
}
}
shader_data = shader->backend_data;
+ gl_shaders = shader_data->gl_shaders.ps;
/* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
* so a linear search is more performant than a hashmap or a binary search
@@ -4216,10 +4215,11 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
*/
for (i = 0; i < shader_data->num_gl_shaders; ++i)
{
- if (!memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)))
+ if (!memcmp(&gl_shaders[i].args, args, sizeof(*args)))
{
- if (args->np2_fixup) *np2fixup_info = &shader_data->gl_shaders[i].np2fixup;
- return shader_data->gl_shaders[i].prgId;
+ if (args->np2_fixup)
+ *np2fixup_info = &gl_shaders[i].np2fixup;
+ return gl_shaders[i].prgId;
}
}
@@ -4228,10 +4228,12 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
if (shader_data->num_gl_shaders)
{
new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
- new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
- new_size * sizeof(*shader_data->gl_shaders));
- } else {
- new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+ new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders.ps,
+ new_size * sizeof(*gl_shaders));
+ }
+ else
+ {
+ new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*gl_shaders));
new_size = 1;
}
@@ -4239,21 +4241,22 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context,
ERR("Out of memory\n");
return 0;
}
- shader_data->gl_shaders = new_array;
+ shader_data->gl_shaders.ps = new_array;
shader_data->shader_array_size = new_size;
+ gl_shaders = new_array;
}
- shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+ gl_shaders[shader_data->num_gl_shaders].args = *args;
- memset(&shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup, 0, sizeof(struct ps_np2fixup_info));
- if (args->np2_fixup) np2fixup = &shader_data->gl_shaders[shader_data->num_gl_shaders].np2fixup;
+ np2fixup = &gl_shaders[shader_data->num_gl_shaders].np2fixup;
+ memset(np2fixup, 0, sizeof(*np2fixup));
+ *np2fixup_info = args->np2_fixup ? np2fixup : NULL;
pixelshader_update_samplers(&shader->reg_maps, state->textures);
shader_buffer_clear(buffer);
ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup);
- shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
- *np2fixup_info = np2fixup;
+ gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
return ret;
}
@@ -4271,9 +4274,9 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
{
UINT i;
DWORD new_size;
- struct glsl_vs_compiled_shader *new_array;
DWORD use_map = shader->device->strided_streams.use_map;
- struct glsl_vshader_private *shader_data;
+ struct glsl_vs_compiled_shader *gl_shaders, *new_array;
+ struct glsl_shader_private *shader_data;
GLhandleARB ret;
if (!shader->backend_data)
@@ -4286,15 +4289,16 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
}
}
shader_data = shader->backend_data;
+ gl_shaders = shader_data->gl_shaders.vs;
/* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2),
* so a linear search is more performant than a hashmap or a binary search
* (cache coherency etc)
*/
- for(i = 0; i < shader_data->num_gl_shaders; i++) {
- if(vs_args_equal(&shader_data->gl_shaders[i].args, args, use_map)) {
- return shader_data->gl_shaders[i].prgId;
- }
+ for (i = 0; i < shader_data->num_gl_shaders; ++i)
+ {
+ if (vs_args_equal(&gl_shaders[i].args, args, use_map))
+ return gl_shaders[i].prgId;
}
TRACE("No matching GL shader found for shader %p, compiling a new shader.\n", shader);
@@ -4303,10 +4307,12 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
if (shader_data->num_gl_shaders)
{
new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2);
- new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders,
- new_size * sizeof(*shader_data->gl_shaders));
- } else {
- new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders));
+ new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders.vs,
+ new_size * sizeof(*gl_shaders));
+ }
+ else
+ {
+ new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*gl_shaders));
new_size = 1;
}
@@ -4314,15 +4320,16 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context,
ERR("Out of memory\n");
return 0;
}
- shader_data->gl_shaders = new_array;
+ shader_data->gl_shaders.vs = new_array;
shader_data->shader_array_size = new_size;
+ gl_shaders = new_array;
}
- shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args;
+ gl_shaders[shader_data->num_gl_shaders].args = *args;
shader_buffer_clear(buffer);
ret = shader_glsl_generate_vshader(context, buffer, shader, args);
- shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
+ gl_shaders[shader_data->num_gl_shaders++].prgId = ret;
return ret;
}
@@ -4721,6 +4728,7 @@ static void shader_glsl_deselect_depth_blt(void *shader_priv, const struct wined
static void shader_glsl_destroy(struct wined3d_shader *shader)
{
+ struct glsl_shader_private *shader_data = shader->backend_data;
struct wined3d_device *device = shader->device;
struct shader_glsl_priv *priv = device->shader_priv;
const struct wined3d_gl_info *gl_info;
@@ -4729,47 +4737,22 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
char pshader = shader_is_pshader_version(shader->reg_maps.shader_version.type);
- if (pshader)
+ if (!shader_data || !shader_data->num_gl_shaders)
{
- struct glsl_pshader_private *shader_data = shader->backend_data;
-
- if (!shader_data || !shader_data->num_gl_shaders)
- {
- HeapFree(GetProcessHeap(), 0, shader_data);
- shader->backend_data = NULL;
- return;
- }
-
- context = context_acquire(device, NULL);
- gl_info = context->gl_info;
-
- if (priv->glsl_program && priv->glsl_program->pshader == shader)
- {
- ENTER_GL();
- shader_glsl_select(context, FALSE, FALSE);
- LEAVE_GL();
- }
+ HeapFree(GetProcessHeap(), 0, shader_data);
+ shader->backend_data = NULL;
+ return;
}
- else
- {
- struct glsl_vshader_private *shader_data = shader->backend_data;
-
- if (!shader_data || !shader_data->num_gl_shaders)
- {
- HeapFree(GetProcessHeap(), 0, shader_data);
- shader->backend_data = NULL;
- return;
- }
- context = context_acquire(device, NULL);
- gl_info = context->gl_info;
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
- if (priv->glsl_program && priv->glsl_program->vshader == shader)
- {
- ENTER_GL();
- shader_glsl_select(context, FALSE, FALSE);
- LEAVE_GL();
- }
+ if (priv->glsl_program && (priv->glsl_program->vshader == shader
+ || priv->glsl_program->pshader == shader))
+ {
+ ENTER_GL();
+ shader_glsl_select(context, FALSE, FALSE);
+ LEAVE_GL();
}
linked_programs = &shader->linked_programs;
@@ -4793,31 +4776,33 @@ static void shader_glsl_destroy(struct wined3d_shader *shader)
if (pshader)
{
- struct glsl_pshader_private *shader_data = shader->backend_data;
+ struct glsl_ps_compiled_shader *gl_shaders = shader_data->gl_shaders.ps;
UINT i;
ENTER_GL();
- for(i = 0; i < shader_data->num_gl_shaders; i++) {
- TRACE("deleting pshader %u\n", shader_data->gl_shaders[i].prgId);
- GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
+ for (i = 0; i < shader_data->num_gl_shaders; ++i)
+ {
+ TRACE("Deleting pixel shader %u.\n", gl_shaders[i].prgId);
+ GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders.ps);
}
else
{
- struct glsl_vshader_private *shader_data = shader->backend_data;
+ struct glsl_vs_compiled_shader *gl_shaders = shader_data->gl_shaders.vs;
UINT i;
ENTER_GL();
- for(i = 0; i < shader_data->num_gl_shaders; i++) {
- TRACE("deleting vshader %u\n", shader_data->gl_shaders[i].prgId);
- GL_EXTCALL(glDeleteObjectARB(shader_data->gl_shaders[i].prgId));
+ for (i = 0; i < shader_data->num_gl_shaders; ++i)
+ {
+ TRACE("Deleting vertex shader %u.\n", gl_shaders[i].prgId);
+ GL_EXTCALL(glDeleteObjectARB(gl_shaders[i].prgId));
checkGLcall("glDeleteObjectARB");
}
LEAVE_GL();
- HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders);
+ HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders.vs);
}
HeapFree(GetProcessHeap(), 0, shader->backend_data);
--
1.7.8.6
More information about the wine-patches
mailing list