- if (msamp->BorderColor.ui[0] ||
- msamp->BorderColor.ui[1] ||
- msamp->BorderColor.ui[2] ||
- msamp->BorderColor.ui[3]) {
- struct gl_texture_image *teximg;
-
- teximg = texobj->Image[0][texobj->BaseLevel];
-
- st_translate_color(msamp->BorderColor.f,
- teximg ? teximg->_BaseFormat : GL_RGBA,
- sampler->border_color.f);
+ /* Check that only wrap modes using the border color have the first bit
+ * set.
+ */
+ STATIC_ASSERT(PIPE_TEX_WRAP_CLAMP & 0x1);
+ STATIC_ASSERT(PIPE_TEX_WRAP_CLAMP_TO_BORDER & 0x1);
+ STATIC_ASSERT(PIPE_TEX_WRAP_MIRROR_CLAMP & 0x1);
+ STATIC_ASSERT(PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER & 0x1);
+ STATIC_ASSERT(((PIPE_TEX_WRAP_REPEAT |
+ PIPE_TEX_WRAP_CLAMP_TO_EDGE |
+ PIPE_TEX_WRAP_MIRROR_REPEAT |
+ PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0);
+
+ /* For non-black borders... */
+ if (/* This is true if wrap modes are using the border color: */
+ (sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1 &&
+ (msamp->BorderColor.ui[0] ||
+ msamp->BorderColor.ui[1] ||
+ msamp->BorderColor.ui[2] ||
+ msamp->BorderColor.ui[3])) {
+ const GLboolean is_integer = texobj->_IsIntegerFormat;
+ GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
+
+ if (texobj->StencilSampling)
+ texBaseFormat = GL_STENCIL_INDEX;
+
+ if (st->apply_texture_swizzle_to_border_color) {
+ const struct st_texture_object *stobj = st_texture_object_const(texobj);
+ /* XXX: clean that up to not use the sampler view at all */
+ const struct st_sampler_view *sv = st_texture_get_current_sampler_view(st, stobj);
+
+ if (sv) {
+ struct pipe_sampler_view *view = sv->view;
+ union pipe_color_union tmp;
+ const unsigned char swz[4] =
+ {
+ view->swizzle_r,
+ view->swizzle_g,
+ view->swizzle_b,
+ view->swizzle_a,
+ };
+
+ st_translate_color(&msamp->BorderColor, &tmp,
+ texBaseFormat, is_integer);
+
+ util_format_apply_color_swizzle(&sampler->border_color,
+ &tmp, swz, is_integer);
+ } else {
+ st_translate_color(&msamp->BorderColor,
+ &sampler->border_color,
+ texBaseFormat, is_integer);
+ }
+ } else {
+ st_translate_color(&msamp->BorderColor,
+ &sampler->border_color,
+ texBaseFormat, is_integer);
+ }