On Wed, Apr 22, 2015 at 1:47 PM, Topi Pohjolainen <topi.pohjolai...@intel.com> wrote: > Signed-off-by: Topi Pohjolainen <topi.pohjolai...@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. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev