[Mesa-dev] [PATCH 05/18] i965: Refactor sampler state setup
Matt Turner
mattst88 at gmail.com
Thu Apr 23 11:53:46 PDT 2015
On Wed, Apr 22, 2015 at 1:47 PM, Topi Pohjolainen
<topi.pohjolainen at intel.com> wrote:
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
> src/mesa/drivers/dri/i965/brw_sampler_state.c | 60 +++++++++++++++++----------
> src/mesa/drivers/dri/i965/brw_state.h | 9 ++++
> 2 files changed, 47 insertions(+), 22 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_sampler_state.c b/src/mesa/drivers/dri/i965/brw_sampler_state.c
> index c78e2e3..c1daa44 100644
> --- a/src/mesa/drivers/dri/i965/brw_sampler_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_sampler_state.c
> @@ -375,21 +375,16 @@ upload_default_color(struct brw_context *brw,
> * Sets the sampler state for a single unit based off of the sampler key
> * entry.
> */
> -static void
> +void
> brw_update_sampler_state(struct brw_context *brw,
> - int unit,
> + GLenum target, bool tex_cube_map_seamless,
> + GLfloat tex_unit_lod_bias,
> + mesa_format format, GLenum base_format,
> + bool is_integer_format,
> + const struct gl_sampler_object* sampler,
* with the parameter name.
> uint32_t *sampler_state,
> uint32_t batch_offset_for_sampler_state)
> {
> - struct gl_context *ctx = &brw->ctx;
> - const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
> - const struct gl_texture_object *texObj = texUnit->_Current;
> - const struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> -
> - /* These don't use samplers at all. */
> - if (texObj->Target == GL_TEXTURE_BUFFER)
> - return;
> -
> unsigned min_filter, mag_filter, mip_filter;
>
> /* Select min and mip filters. */
> @@ -459,12 +454,12 @@ brw_update_sampler_state(struct brw_context *brw,
> unsigned wrap_t = translate_wrap_mode(brw, sampler->WrapT, either_nearest);
> unsigned wrap_r = translate_wrap_mode(brw, sampler->WrapR, either_nearest);
>
> - if (texObj->Target == GL_TEXTURE_CUBE_MAP ||
> - texObj->Target == GL_TEXTURE_CUBE_MAP_ARRAY) {
> + if (target == GL_TEXTURE_CUBE_MAP ||
> + target == GL_TEXTURE_CUBE_MAP_ARRAY) {
> /* Cube maps must use the same wrap mode for all three coordinate
> * dimensions. Prior to Haswell, only CUBE and CLAMP are valid.
> */
> - if ((ctx->Texture.CubeMapSeamless || sampler->CubeMapSeamless) &&
> + if ((tex_cube_map_seamless || sampler->CubeMapSeamless) &&
> (sampler->MinFilter != GL_NEAREST ||
> sampler->MagFilter != GL_NEAREST)) {
> wrap_s = BRW_TEXCOORDMODE_CUBE;
> @@ -475,7 +470,7 @@ brw_update_sampler_state(struct brw_context *brw,
> wrap_t = BRW_TEXCOORDMODE_CLAMP;
> wrap_r = BRW_TEXCOORDMODE_CLAMP;
> }
> - } else if (texObj->Target == GL_TEXTURE_1D) {
> + } else if (target == GL_TEXTURE_1D) {
> /* There's a bug in 1D texture sampling - it actually pays
> * attention to the wrap_t value, though it should not.
> * Override the wrap_t value here to GL_REPEAT to keep
> @@ -495,7 +490,7 @@ brw_update_sampler_state(struct brw_context *brw,
> const unsigned min_lod = U_FIXED(CLAMP(sampler->MinLod, 0, 13), lod_bits);
> const unsigned max_lod = U_FIXED(CLAMP(sampler->MaxLod, 0, 13), lod_bits);
> const int lod_bias =
> - S_FIXED(CLAMP(texUnit->LodBias + sampler->LodBias, -16, 15), lod_bits);
> + S_FIXED(CLAMP(tex_unit_lod_bias + sampler->LodBias, -16, 15), lod_bits);
> const unsigned base_level = U_FIXED(0, 1);
>
> /* Upload the border color if necessary. If not, just point it at
> @@ -506,14 +501,12 @@ brw_update_sampler_state(struct brw_context *brw,
> if (wrap_mode_needs_border_color(wrap_s) ||
> wrap_mode_needs_border_color(wrap_t) ||
> wrap_mode_needs_border_color(wrap_r)) {
> - const struct gl_texture_image *first_image =
> - texObj->Image[0][texObj->BaseLevel];
> upload_default_color(brw, sampler,
> - first_image->TexFormat, first_image->_BaseFormat,
> - texObj->_IsIntegerFormat, &border_color_offset);
> + format, base_format, is_integer_format,
> + &border_color_offset);
> }
>
> - const bool non_normalized_coords = texObj->Target == GL_TEXTURE_RECTANGLE;
> + const bool non_normalized_coords = target == GL_TEXTURE_RECTANGLE;
>
> brw_emit_sampler_state(brw,
> sampler_state,
> @@ -528,6 +521,29 @@ brw_update_sampler_state(struct brw_context *brw,
> border_color_offset);
> }
>
> +static void
> +update_sampler_state(struct brw_context *brw,
> + int unit,
> + uint32_t *sampler_state,
> + uint32_t batch_offset_for_sampler_state)
> +{
> + struct gl_context *ctx = &brw->ctx;
> + const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
> + const struct gl_texture_object *texObj = texUnit->_Current;
> + const struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
> +
> + /* These don't use samplers at all. */
> + if (texObj->Target == GL_TEXTURE_BUFFER)
> + return;
> +
> + struct gl_texture_image *firstImage = texObj->Image[0][texObj->BaseLevel];
> + brw_update_sampler_state(brw, texObj->Target, ctx->Texture.CubeMapSeamless,
> + texUnit->LodBias,
> + firstImage->TexFormat, firstImage->_BaseFormat,
> + texObj->_IsIntegerFormat,
> + sampler,
> + sampler_state, batch_offset_for_sampler_state);
> +}
>
> static void
> brw_upload_sampler_state_table(struct brw_context *brw,
> @@ -557,7 +573,7 @@ brw_upload_sampler_state_table(struct brw_context *brw,
> if (SamplersUsed & (1 << s)) {
> const unsigned unit = prog->SamplerUnits[s];
> if (ctx->Texture.Unit[unit]._Current) {
> - brw_update_sampler_state(brw, unit, sampler_state,
> + update_sampler_state(brw, unit, sampler_state,
> batch_offset_for_sampler_state);
> }
> }
> diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
> index 8798369..23f36c0 100644
> --- a/src/mesa/drivers/dri/i965/brw_state.h
> +++ b/src/mesa/drivers/dri/i965/brw_state.h
> @@ -283,6 +283,15 @@ void brw_emit_sampler_state(struct brw_context *brw,
> bool non_normalized_coordinates,
> uint32_t border_color_offset);
>
> +void brw_update_sampler_state(struct brw_context *brw,
> + GLenum target, bool tex_cube_map_seamless,
> + GLfloat tex_unit_lod_bias,
> + mesa_format format, GLenum base_format,
> + bool is_integer_format,
> + const struct gl_sampler_object* sampler,
* with the parameter name.
More information about the mesa-dev
mailing list