whitespace errors were fixed locally best, Gert
Am Dienstag, den 24.07.2018, 21:27 +0200 schrieb Gert Wollny: > It seems the hardware always expects floating point border color > values > [0,1] for unsigned, and [-1,1] for signed texture component, > regardless > of pixel type, but the border colors are passed according to texture > component type. Hence, before submitting the border color, convert > and > scale it these ranges accordingly. > > This doesn't seem to work for textures with 32 bit integer components > though, here, it seems that the border color is always set to zero, > regardless of the BORDER_COLOR_TYPE state set in > Q_TEX_SAMPLER_WORD0_0. > > v2: Simplyfy logic as suggested by Roland Schneidegger > > Fixes: > dEQP-GLES31.functional.texture.border_clamp.formats.compressed* > dEQP-GLES31.functional.texture.border_clamp.formats.r* (non 32 bit > integer) > dEQP- > GLES31.functional.texture.border_clamp.per_axis_wrap_mode.texture_2d* > and a number of piglits out of > piglit run gpu -t texture -t gather -t formats > > Signed-off-by: Gert Wollny <gw.foss...@gmail.com> > --- > src/gallium/drivers/r600/evergreen_state.c | 45 > +++++++++++++++++++++++++++++- > 1 file changed, 44 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index d100cfab1d..e7207a500b 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -2402,6 +2402,37 @@ static void > evergreen_emit_cs_sampler_views(struct r600_context *rctx, struct r6 > EG_FETCH_CONSTANTS_OFFSET_CS + > R600_MAX_CONST_BUFFERS, RADEON_CP_PACKET3_COMPUTE_MODE); > } > > +static void evergreen_convert_border_color(union pipe_color_union > *in, > + union pipe_color_union > *out, > + enum pipe_format format) > +{ > + if (util_format_is_pure_integer(format) && > + !util_format_is_depth_or_stencil(format)) { > + const struct util_format_description *d = > util_format_description(format); > + > + for (int i = 0; i < d->nr_channels; ++i) { > + int cs = d->channel[i].size; > + if (d->channel[i].type == > UTIL_FORMAT_TYPE_SIGNED) > + out->f[i] = (double)(in->i[i]) / > ((1ul << (cs - 1)) - 1 ); > + else if (d->channel[i].type == > UTIL_FORMAT_TYPE_UNSIGNED) > + out->f[i] = (double)(in->ui[i]) / > ((1ul << cs) - 1 ); > + else > + out->f[i] = 0; > + } > + > + } else { > + switch (format) { > + case PIPE_FORMAT_X24S8_UINT: > + case PIPE_FORMAT_X32_S8X24_UINT: Whitespace error fixed locally. > + out->f[0] = (double)(in->ui[0]) / 255.0; > + out->f[1] = out->f[2] = out->f[3] = 0.0f; > + break; > + default: > + memcpy(out->f, in->f, 4 * sizeof(float)); > + } > + } > +} > + > static void evergreen_emit_sampler_states(struct r600_context *rctx, > struct r600_textures_info *texinfo, > unsigned resource_id_base, > @@ -2410,6 +2441,8 @@ static void > evergreen_emit_sampler_states(struct r600_context *rctx, > { > struct radeon_cmdbuf *cs = rctx->b.gfx.cs; > uint32_t dirty_mask = texinfo->states.dirty_mask; > + union pipe_color_union border_color = {{0,0,0,1}}; > + union pipe_color_union *border_color_ptr = &border_color; > > while (dirty_mask) { > struct r600_pipe_sampler_state *rstate; > @@ -2418,6 +2451,16 @@ static void > evergreen_emit_sampler_states(struct r600_context *rctx, > rstate = texinfo->states.states[i]; > assert(rstate); > > + if (rstate->border_color_use) { > + struct r600_pipe_sampler_view *rview > = texinfo->views.views[i]; > + if (rview) { > + evergreen_convert_border_color(&rsta > te->border_color, > + &bord > er_color, rview->base.format); > + } else { > + border_color_ptr = &rstate- > >border_color; > + } > + } > + > radeon_emit(cs, PKT3(PKT3_SET_SAMPLER, 3, 0) | > pkt_flags); > radeon_emit(cs, (resource_id_base + i) * 3); > radeon_emit_array(cs, rstate->tex_sampler_words, 3); > @@ -2425,7 +2468,7 @@ static void > evergreen_emit_sampler_states(struct r600_context *rctx, > if (rstate->border_color_use) { > radeon_set_config_reg_seq(cs, > border_index_reg, 5); > radeon_emit(cs, i); > - radeon_emit_array(cs, rstate- > >border_color.ui, 4); > + radeon_emit_array(cs, border_color_ptr->ui, > 4); > } > } > texinfo->states.dirty_mask = 0; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev