From 12edaf9ad01db5f759616488267aa36a732f1314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Tue, 14 Mar 2017 13:15:58 +0100 Subject: [PATCH] wined3d: Introduce context_get_tex_unit_mapping() helper function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/context.c | 37 ++++++++++++++++++++++++++++++++++ dlls/wined3d/glsl_shader.c | 35 ++++++-------------------------- dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 42b12458b30..e1ecbbbc8fc 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -2081,6 +2081,43 @@ void context_destroy(struct wined3d_device *device, struct wined3d_context *cont if (destroy) HeapFree(GetProcessHeap(), 0, context); } +const DWORD *context_get_tex_unit_mapping(const struct wined3d_context *context, + const struct wined3d_shader_version *shader_version, unsigned int *base, unsigned int *count) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (!shader_version) + { + *base = 0; + *count = MAX_TEXTURES; + return context->tex_unit_map; + } + + if (shader_version->major >= 4) + { + wined3d_gl_limits_get_texture_unit_range(&gl_info->limits, shader_version->type, base, count); + return NULL; + } + + switch (shader_version->type) + { + case WINED3D_SHADER_TYPE_PIXEL: + *base = 0; + *count = MAX_FRAGMENT_SAMPLERS; + break; + case WINED3D_SHADER_TYPE_VERTEX: + *base = MAX_FRAGMENT_SAMPLERS; + *count = MAX_VERTEX_SAMPLERS; + break; + default: + ERR("Unhandled shader type %#x.\n", shader_version->type); + *base = 0; + *count = 0; + } + + return context->tex_unit_map; +} + /* Context activation is done by the caller. */ static void set_blit_dimension(const struct wined3d_gl_info *gl_info, UINT width, UINT height) { diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 572d2ef9773..34427eadd4b 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -624,36 +624,15 @@ static void shader_glsl_load_samplers_range(const struct wined3d_gl_info *gl_inf static void shader_glsl_load_samplers(const struct wined3d_context *context, struct shader_glsl_priv *priv, GLuint program_id, const struct wined3d_shader_reg_maps *reg_maps) { - const struct wined3d_shader_version *version = ®_maps->shader_version; - const char *prefix = shader_glsl_get_prefix(version->type); const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_shader_version *shader_version; const DWORD *tex_unit_map; unsigned int base, count; + const char *prefix; - if (reg_maps->shader_version.major >= 4) - { - tex_unit_map = NULL; - wined3d_gl_limits_get_texture_unit_range(&gl_info->limits, version->type, &base, &count); - } - else - { - tex_unit_map = context->tex_unit_map; - switch (reg_maps->shader_version.type) - { - case WINED3D_SHADER_TYPE_PIXEL: - base = 0; - count = MAX_FRAGMENT_SAMPLERS; - break; - case WINED3D_SHADER_TYPE_VERTEX: - base = MAX_FRAGMENT_SAMPLERS; - count = MAX_VERTEX_SAMPLERS; - break; - default: - ERR("Unhandled shader type %#x.\n", reg_maps->shader_version.type); - return; - } - } - + shader_version = reg_maps ? ®_maps->shader_version : NULL; + prefix = shader_glsl_get_prefix(shader_version ? shader_version->type : WINED3D_SHADER_TYPE_PIXEL); + tex_unit_map = context_get_tex_unit_mapping(context, shader_version, &base, &count); shader_glsl_load_samplers_range(gl_info, priv, program_id, prefix, base, count, tex_unit_map); } @@ -9096,9 +9075,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const { entry->constant_update_mask |= WINED3D_SHADER_CONST_FFP_PS; - shader_glsl_load_samplers_range(gl_info, priv, program_id, - shader_glsl_get_prefix(WINED3D_SHADER_TYPE_PIXEL), - 0, MAX_TEXTURES, context->tex_unit_map); + shader_glsl_load_samplers(context, priv, program_id, NULL); } for (i = 0; i < MAX_TEXTURES; ++i) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 80b7236ed24..8637dd38d0a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1926,6 +1926,8 @@ void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN; GLenum context_get_offscreen_gl_buffer(const struct wined3d_context *context) DECLSPEC_HIDDEN; +const DWORD *context_get_tex_unit_mapping(const struct wined3d_context *context, + const struct wined3d_shader_version *shader_version, unsigned int *base, unsigned int *count) DECLSPEC_HIDDEN; DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN; void context_gl_resource_released(struct wined3d_device *device, GLuint name, BOOL rb_namespace) DECLSPEC_HIDDEN;