From 584ec259b25bdde4b5ae0bb52cab438fbe76c84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Mon, 20 Mar 2017 12:13:06 +0100 Subject: [PATCH] wined3d: Introduce wined3d_sampler_bind() 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 | 16 ++++------------ dlls/wined3d/sampler.c | 21 +++++++++++++++++++++ dlls/wined3d/view.c | 7 ++++++- dlls/wined3d/wined3d_private.h | 7 +++++-- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index baba979d7e5..c1803a4de11 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -3394,14 +3394,12 @@ static void context_bind_shader_resources(struct wined3d_context *context, const struct wined3d_state *state, enum wined3d_shader_type shader_type) { unsigned int bind_idx, shader_sampler_count, base, count, i; - const struct wined3d_gl_info *gl_info = context->gl_info; const struct wined3d_device *device = context->device; struct wined3d_shader_sampler_map_entry *entry; struct wined3d_shader_resource_view *view; const struct wined3d_shader *shader; struct wined3d_sampler *sampler; const DWORD *tex_unit_map; - GLuint sampler_name; if (!(shader = state->shader[shader_type])) return; @@ -3429,16 +3427,10 @@ static void context_bind_shader_resources(struct wined3d_context *context, } if (entry->sampler_idx == WINED3D_SAMPLER_DEFAULT) - sampler_name = device->default_sampler->name; - else if ((sampler = state->sampler[shader_type][entry->sampler_idx])) - sampler_name = sampler->name; - else - sampler_name = device->null_sampler->name; - - context_active_texture(context, gl_info, bind_idx); - GL_EXTCALL(glBindSampler(bind_idx, sampler_name)); - checkGLcall("glBindSampler"); - wined3d_shader_resource_view_bind(view, context); + sampler = device->default_sampler; + else if (!(sampler = state->sampler[shader_type][entry->sampler_idx])) + sampler = device->null_sampler; + wined3d_shader_resource_view_bind(view, bind_idx, sampler, context); } } diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c index a987a35c501..c1364c2641a 100644 --- a/dlls/wined3d/sampler.c +++ b/dlls/wined3d/sampler.c @@ -150,3 +150,24 @@ HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct return WINED3D_OK; } + +/* This function relies on the correct texture being bound and loaded. */ +void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit, + struct wined3d_texture *texture, const struct wined3d_context *context) +{ + const struct wined3d_gl_info *gl_info = context->gl_info; + + if (gl_info->supported[ARB_SAMPLER_OBJECTS]) + { + GL_EXTCALL(glBindSampler(unit, sampler->name)); + checkGLcall("bind sampler"); + } + else if (texture) + { + wined3d_texture_apply_sampler_desc(texture, &sampler->desc, context); + } + else + { + ERR("Could not apply sampler state.\n"); + } +} diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c index ff31de2d3ac..ac558a41607 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -638,13 +638,17 @@ HRESULT CDECL wined3d_shader_resource_view_create(const struct wined3d_view_desc } void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, - struct wined3d_context *context) + unsigned int unit, struct wined3d_sampler *sampler, struct wined3d_context *context) { + const struct wined3d_gl_info *gl_info = context->gl_info; struct wined3d_texture *texture; + context_active_texture(context, gl_info, unit); + if (view->gl_view.name) { context_bind_texture(context, view->gl_view.target, view->gl_view.name); + wined3d_sampler_bind(sampler, unit, NULL, context); return; } @@ -656,6 +660,7 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view texture = wined3d_texture_from_resource(view->resource); wined3d_texture_bind(texture, context, FALSE); + wined3d_sampler_bind(sampler, unit, texture, context); } ULONG CDECL wined3d_unordered_access_view_incref(struct wined3d_unordered_access_view *view) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 3b342d8a0ad..21c5f1b3835 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3087,6 +3087,9 @@ struct wined3d_sampler GLuint name; }; +void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit, + struct wined3d_texture *texture, const struct wined3d_context *context) DECLSPEC_HIDDEN; + struct wined3d_vertex_declaration_element { const struct wined3d_format *format; @@ -3415,8 +3418,8 @@ struct wined3d_shader_resource_view struct wined3d_gl_view gl_view; }; -void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, - struct wined3d_context *context) DECLSPEC_HIDDEN; +void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, unsigned int unit, + struct wined3d_sampler *sampler, struct wined3d_context *context) DECLSPEC_HIDDEN; struct wined3d_unordered_access_view {