=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Introduce wined3d_gl_limits_get_uniform_block_range().
Alexandre Julliard
julliard at winehq.org
Wed Jun 22 11:04:41 CDT 2016
Module: wine
Branch: master
Commit: f6bd191385431929f5a8847a8a3556e6309850df
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f6bd191385431929f5a8847a8a3556e6309850df
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Wed Jun 22 11:37:32 2016 +0200
wined3d: Introduce wined3d_gl_limits_get_uniform_block_range().
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/glsl_shader.c | 17 +++++++----------
dlls/wined3d/state.c | 14 +++++++++-----
dlls/wined3d/utils.c | 27 +++++++++++++++++++++++++++
dlls/wined3d/wined3d_private.h | 9 ++++++---
4 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index b4ddf89..3aa9626 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -7518,13 +7518,14 @@ static void shader_glsl_init_ps_uniform_locations(const struct wined3d_gl_info *
static void shader_glsl_init_uniform_block_bindings(const struct wined3d_gl_info *gl_info,
struct shader_glsl_priv *priv, GLuint program_id,
- const struct wined3d_shader_reg_maps *reg_maps, unsigned int base, unsigned int count)
+ const struct wined3d_shader_reg_maps *reg_maps)
{
+ struct wined3d_string_buffer *name = string_buffer_get(&priv->string_buffers);
const char *prefix = shader_glsl_get_prefix(reg_maps->shader_version.type);
+ unsigned int i, base, count;
GLuint block_idx;
- unsigned int i;
- struct wined3d_string_buffer *name = string_buffer_get(&priv->string_buffers);
+ wined3d_gl_limits_get_uniform_block_range(&gl_info->limits, reg_maps->shader_version.type, &base, &count);
for (i = 0; i < count; ++i)
{
if (!reg_maps->cb_sizes[i])
@@ -7819,8 +7820,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
if (entry->vs.pos_fixup_location != -1)
entry->constant_update_mask |= WINED3D_SHADER_CONST_POS_FIXUP;
- shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &vshader->reg_maps,
- 0, gl_info->limits.vertex_uniform_blocks);
+ shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &vshader->reg_maps);
}
else
{
@@ -7860,8 +7860,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
if (gshader)
{
entry->constant_update_mask |= WINED3D_SHADER_CONST_POS_FIXUP;
- shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &gshader->reg_maps,
- gl_info->limits.vertex_uniform_blocks, gl_info->limits.geometry_uniform_blocks);
+ shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &gshader->reg_maps);
}
if (ps_id)
@@ -7876,9 +7875,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
if (entry->ps.ycorrection_location != -1)
entry->constant_update_mask |= WINED3D_SHADER_CONST_PS_Y_CORR;
- shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &pshader->reg_maps,
- gl_info->limits.vertex_uniform_blocks + gl_info->limits.geometry_uniform_blocks,
- gl_info->limits.fragment_uniform_blocks);
+ shader_glsl_init_uniform_block_bindings(gl_info, priv, program_id, &pshader->reg_maps);
}
else
{
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index bc55263..6b9cd3d 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4849,30 +4849,34 @@ static void state_cb(const struct wined3d_gl_info *gl_info, const struct wined3d
static void state_cb_vs(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
const struct wined3d_gl_limits *limits = &context->gl_info->limits;
+ unsigned int base, count;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
- state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_VERTEX, 0, limits->vertex_uniform_blocks);
+ wined3d_gl_limits_get_uniform_block_range(limits, WINED3D_SHADER_TYPE_VERTEX, &base, &count);
+ state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_VERTEX, base, count);
}
static void state_cb_gs(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
const struct wined3d_gl_limits *limits = &context->gl_info->limits;
+ unsigned int base, count;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
- state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_GEOMETRY,
- limits->vertex_uniform_blocks, limits->geometry_uniform_blocks);
+ wined3d_gl_limits_get_uniform_block_range(limits, WINED3D_SHADER_TYPE_GEOMETRY, &base, &count);
+ state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_GEOMETRY, base, count);
}
static void state_cb_ps(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
const struct wined3d_gl_limits *limits = &context->gl_info->limits;
+ unsigned int base, count;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
- state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_PIXEL,
- limits->vertex_uniform_blocks + limits->geometry_uniform_blocks, limits->fragment_uniform_blocks);
+ wined3d_gl_limits_get_uniform_block_range(limits, WINED3D_SHADER_TYPE_PIXEL, &base, &count);
+ state_cb(context->gl_info, state, WINED3D_SHADER_TYPE_PIXEL, base, count);
}
static void state_cb_warn(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 9575b39..01e56eb 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5748,3 +5748,30 @@ BOOL wined3d_clip_blit(const RECT *clip_rect, RECT *clipped, RECT *other)
return TRUE;
}
+
+void wined3d_gl_limits_get_uniform_block_range(const struct wined3d_gl_limits *gl_limits,
+ enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count)
+{
+ *base = 0;
+ *count = gl_limits->vertex_uniform_blocks;
+
+ if (shader_type == WINED3D_SHADER_TYPE_VERTEX)
+ return;
+
+ *base += *count;
+ *count = gl_limits->geometry_uniform_blocks;
+
+ if (shader_type == WINED3D_SHADER_TYPE_GEOMETRY)
+ return;
+
+ *base += *count;
+ *count = gl_limits->fragment_uniform_blocks;
+
+ if (shader_type == WINED3D_SHADER_TYPE_PIXEL)
+ return;
+
+ *base += *count;
+ *count = 0;
+
+ ERR("Unhandled shader type %#x.\n", shader_type);
+}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 701e93e..ce094ca 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1971,9 +1971,9 @@ struct wined3d_gl_limits
UINT lights;
UINT textures;
UINT texture_coords;
- UINT vertex_uniform_blocks;
- UINT geometry_uniform_blocks;
- UINT fragment_uniform_blocks;
+ unsigned int vertex_uniform_blocks;
+ unsigned int geometry_uniform_blocks;
+ unsigned int fragment_uniform_blocks;
UINT fragment_samplers;
UINT vertex_samplers;
UINT combined_samplers;
@@ -2004,6 +2004,9 @@ struct wined3d_gl_limits
UINT arb_ps_temps;
};
+void wined3d_gl_limits_get_uniform_block_range(const struct wined3d_gl_limits *gl_limits,
+ enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count) DECLSPEC_HIDDEN;
+
struct wined3d_gl_info
{
DWORD selected_gl_version;
More information about the wine-cvs
mailing list