diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 7b8fabda868..d90ea7efa73 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -7782,7 +7782,7 @@ radv_init_sampler(struct radv_device *device, struct radv_sampler *sampler, S_008F38_ANISO_OVERRIDE_GFX10(device->instance->disable_aniso_single_level); } else { sampler->state[2] |= - S_008F38_LOD_BIAS(radv_float_to_sfixed(CLAMP(pCreateInfo->mipLodBias, -16, 15), 8)) | + S_008F38_LOD_BIAS(radv_float_to_sfixed(CLAMP(pCreateInfo->mipLodBias, -16, 16), 8)) | S_008F38_DISABLE_LSB_CEIL(device->physical_device->rad_info.gfx_level <= GFX8) | S_008F38_FILTER_PREC_FIX(1) | S_008F38_ANISO_OVERRIDE_GFX8(device->instance->disable_aniso_single_level && diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index caf07a7479f..c649aa49104 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -415,6 +415,8 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) static float si_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param) { + struct si_screen *sscreen = (struct si_screen *)pscreen; + switch (param) { case PIPE_CAPF_MIN_LINE_WIDTH: case PIPE_CAPF_MIN_LINE_WIDTH_AA: @@ -435,7 +437,8 @@ static float si_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param) case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: return 16.0f; case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: - return 16.0f; + /* This is the maximum value of the LOD_BIAS sampler field. */ + return sscreen->info.gfx_level >= GFX10 ? 31 : 16; case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE: case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE: case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY: diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 018e7ce4b49..6e69974a438 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -4827,7 +4827,7 @@ static void *si_create_sampler_state(struct pipe_context *ctx, S_008F38_ANISO_OVERRIDE_GFX10(1); } else { rstate->val[0] |= S_008F30_COMPAT_MODE(sctx->gfx_level >= GFX8); - rstate->val[2] |= S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 15), 8)) | + rstate->val[2] |= S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) | S_008F38_DISABLE_LSB_CEIL(sctx->gfx_level <= GFX8) | S_008F38_FILTER_PREC_FIX(1) | S_008F38_ANISO_OVERRIDE_GFX8(sctx->gfx_level >= GFX8);