X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fgen7_sampler_state.c;h=d796fb504992e7a5643b1a49bc9ab8d9083b85d7;hb=a4546ec114853235db375b20fb47ddcd6a7f21e7;hp=5701f4d8f04508392c2df4dd5382ad0abc716e43;hpb=7e01af662ad12bd2b27034f3ca7687e2986b5dbd;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/gen7_sampler_state.c b/src/mesa/drivers/dri/i965/gen7_sampler_state.c index 5701f4d8f04..d796fb50499 100644 --- a/src/mesa/drivers/dri/i965/gen7_sampler_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sampler_state.c @@ -25,6 +25,7 @@ #include "brw_state.h" #include "brw_defines.h" #include "intel_batchbuffer.h" +#include "intel_mipmap_tree.h" #include "main/macros.h" #include "main/samplerobj.h" @@ -40,6 +41,8 @@ gen7_update_sampler_state(struct brw_context *brw, int unit, int ss_index, struct gl_context *ctx = &brw->ctx; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; struct gl_texture_object *texObj = texUnit->_Current; + struct intel_texture_image *intel_image = + intel_texture_image(texObj->Image[0][texObj->BaseLevel]); struct gl_sampler_object *gl_sampler = _mesa_get_samplerobj(ctx, unit); bool using_nearest = false; @@ -113,7 +116,7 @@ gen7_update_sampler_state(struct brw_context *brw, int unit, int ss_index, */ if (texObj->Target == GL_TEXTURE_CUBE_MAP || texObj->Target == GL_TEXTURE_CUBE_MAP_ARRAY) { - if (ctx->Texture.CubeMapSeamless && + if ((ctx->Texture.CubeMapSeamless || gl_sampler->CubeMapSeamless) && (gl_sampler->MinFilter != GL_NEAREST || gl_sampler->MagFilter != GL_NEAREST)) { sampler->ss3.r_wrap_mode = BRW_TEXCOORDMODE_CUBE; @@ -150,17 +153,13 @@ gen7_update_sampler_state(struct brw_context *brw, int unit, int ss_index, sampler->ss0.lod_preclamp = 1; /* OpenGL mode */ sampler->ss0.default_color_mode = 0; /* OpenGL/DX10 mode */ - /* Set BaseMipLevel, MaxLOD, MinLOD: - * - * XXX: I don't think that using firstLevel, lastLevel works, - * because we always setup the surface state as if firstLevel == - * level zero. Probably have to subtract firstLevel from each of - * these: - */ - sampler->ss0.base_level = U_FIXED(0, 1); + int baselevel = texObj->BaseLevel - intel_image->mt->first_level; + sampler->ss0.base_level = U_FIXED(baselevel, 1); - sampler->ss1.max_lod = U_FIXED(CLAMP(gl_sampler->MaxLod, 0, 13), 8); - sampler->ss1.min_lod = U_FIXED(CLAMP(gl_sampler->MinLod, 0, 13), 8); + sampler->ss1.max_lod = U_FIXED(CLAMP(baselevel + + gl_sampler->MaxLod, 0, 13), 8); + sampler->ss1.min_lod = U_FIXED(CLAMP(baselevel + + gl_sampler->MinLod, 0, 13), 8); /* The sampler can handle non-normalized texture rectangle coordinates * natively @@ -187,7 +186,7 @@ gen7_update_sampler_state(struct brw_context *brw, int unit, int ss_index, static void gen7_upload_sampler_state_table(struct brw_context *brw, struct gl_program *prog, - uint32_t *sampler_count, + uint32_t sampler_count, uint32_t *sst_offset, uint32_t *sdc_offset) { @@ -196,17 +195,15 @@ gen7_upload_sampler_state_table(struct brw_context *brw, GLbitfield SamplersUsed = prog->SamplersUsed; - *sampler_count = _mesa_fls(SamplersUsed); - - if (*sampler_count == 0) + if (sampler_count == 0) return; samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE, - *sampler_count * sizeof(*samplers), + sampler_count * sizeof(*samplers), 32, sst_offset); - memset(samplers, 0, *sampler_count * sizeof(*samplers)); + memset(samplers, 0, sampler_count * sizeof(*samplers)); - for (unsigned s = 0; s < *sampler_count; s++) { + for (unsigned s = 0; s < sampler_count; s++) { if (SamplersUsed & (1 << s)) { const unsigned unit = prog->SamplerUnits[s]; if (ctx->Texture.Unit[unit]._ReallyEnabled)