Module: wine Branch: master Commit: ec1da699d947d077ce4fe22a8119a7528296a1da URL: http://source.winehq.org/git/wine.git/?a=commit;h=ec1da699d947d077ce4fe22a81...
Author: Józef Kucia jkucia@codeweavers.com Date: Mon Mar 20 12:13:08 2017 +0100
wined3d: Make wined3d samplers responsible for setting texture base level.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/d3d11/state.c | 1 + dlls/wined3d/device.c | 1 + dlls/wined3d/sampler.c | 28 ++++++++++++++++++++++++++++ dlls/wined3d/state.c | 22 +--------------------- include/wine/wined3d.h | 1 + 5 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c index 77c8e55..0a16e58 100644 --- a/dlls/d3d11/state.c +++ b/dlls/d3d11/state.c @@ -1205,6 +1205,7 @@ HRESULT d3d_sampler_state_init(struct d3d_sampler_state *state, struct d3d_devic wined3d_desc.lod_bias = desc->MipLODBias; wined3d_desc.min_lod = desc->MinLOD; wined3d_desc.max_lod = desc->MaxLOD; + wined3d_desc.mip_base_level = 0; wined3d_desc.max_anisotropy = D3D11_DECODE_IS_ANISOTROPIC_FILTER(desc->Filter) ? desc->MaxAnisotropy : 1; wined3d_desc.compare = wined3d_texture_compare_from_d3d11(desc->Filter); wined3d_desc.comparison_func = wined3d_cmp_func_from_d3d11(desc->ComparisonFunc); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index a34cb97..9b0fcfb 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -788,6 +788,7 @@ static void create_default_samplers(struct wined3d_device *device, struct wined3 desc.lod_bias = 0.0f; desc.min_lod = -1000.0f; desc.max_lod = 1000.0f; + desc.mip_base_level = 0; desc.max_anisotropy = 1; desc.compare = FALSE; desc.comparison_func = WINED3D_CMP_NEVER; diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c index c1364c2..294d766 100644 --- a/dlls/wined3d/sampler.c +++ b/dlls/wined3d/sampler.c @@ -151,6 +151,31 @@ HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct return WINED3D_OK; }
+static void texture_apply_base_level(struct wined3d_texture *texture, + const struct wined3d_sampler_desc *desc, const struct wined3d_gl_info *gl_info) +{ + struct gl_texture *gl_tex; + unsigned int base_level; + + if (texture->flags & WINED3D_TEXTURE_COND_NP2) + base_level = 0; + else if (desc->mip_filter == WINED3D_TEXF_NONE) + base_level = texture->lod; + else + base_level = min(max(desc->mip_base_level, texture->lod), texture->level_count - 1); + + gl_tex = wined3d_texture_get_gl_texture(texture, texture->flags & WINED3D_TEXTURE_IS_SRGB); + if (base_level != gl_tex->base_level) + { + /* Note that WINED3D_SAMP_MAX_MIP_LEVEL specifies the largest mipmap + * (default 0), while GL_TEXTURE_MAX_LEVEL specifies the smallest + * mipmap used (default 1000). So WINED3D_SAMP_MAX_MIP_LEVEL + * corresponds to GL_TEXTURE_BASE_LEVEL. */ + gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, base_level); + gl_tex->base_level = base_level; + } +} + /* 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) @@ -170,4 +195,7 @@ void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit, { ERR("Could not apply sampler state.\n"); } + + if (texture) + texture_apply_base_level(texture, &sampler->desc, gl_info); } diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 7fcd2b9..409c161 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3562,6 +3562,7 @@ static void wined3d_sampler_desc_from_sampler_states(struct wined3d_sampler_desc desc->lod_bias = lod_bias.f; desc->min_lod = -1000.0f; desc->max_lod = 1000.0f; + desc->mip_base_level = sampler_states[WINED3D_SAMP_MAX_MIP_LEVEL]; desc->max_anisotropy = sampler_states[WINED3D_SAMP_MAX_ANISOTROPY]; if ((sampler_states[WINED3D_SAMP_MAG_FILTER] != WINED3D_TEXF_ANISOTROPIC && sampler_states[WINED3D_SAMP_MIN_FILTER] != WINED3D_TEXF_ANISOTROPIC @@ -3618,8 +3619,6 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state struct wined3d_sampler_desc desc; struct wined3d_sampler *sampler; struct wine_rb_entry *entry; - struct gl_texture *gl_tex; - unsigned int base_level;
wined3d_sampler_desc_from_sampler_states(&desc, context, sampler_states, texture);
@@ -3646,25 +3645,6 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state if (sampler) wined3d_sampler_bind(sampler, mapped_stage, texture, context);
- if (texture->flags & WINED3D_TEXTURE_COND_NP2) - base_level = 0; - else if (desc.mip_filter == WINED3D_TEXF_NONE) - base_level = texture->lod; - else - base_level = min(max(sampler_states[WINED3D_SAMP_MAX_MIP_LEVEL], - texture->lod), texture->level_count - 1); - - gl_tex = wined3d_texture_get_gl_texture(texture, texture->flags & WINED3D_TEXTURE_IS_SRGB); - if (base_level != gl_tex->base_level) - { - /* Note that WINED3D_SAMP_MAX_MIP_LEVEL specifies the largest mipmap - * (default 0), while GL_TEXTURE_MAX_LEVEL specifies the smallest - * mipmap used (default 1000). So WINED3D_SAMP_MAX_MIP_LEVEL - * corresponds to GL_TEXTURE_BASE_LEVEL. */ - gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, base_level); - gl_tex->base_level = base_level; - } - /* Trigger shader constant reloading (for NP2 texcoord fixup) */ if (!(texture->flags & WINED3D_TEXTURE_POW2_MAT_IDENT)) context->constant_update_mask |= WINED3D_SHADER_CONST_PS_NP2_FIXUP; diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index acdb4f3..3b0f6db 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1942,6 +1942,7 @@ struct wined3d_sampler_desc float lod_bias; float min_lod; float max_lod; + unsigned int mip_base_level; unsigned int max_anisotropy; BOOL compare; enum wined3d_cmp_func comparison_func;