[PATCH 6/8] wined3d: Make wined3d samplers responsible for setting texture base level.
Józef Kucia
jkucia at codeweavers.com
Mon Mar 20 06:13:08 CDT 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
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;
--
2.10.2
More information about the wine-patches
mailing list