r300g: fix texture border color for all texture formats
This fixes 8 texwrap format tests. The code should handle arbitrary formats now and is cleaner. NOTE: This is a candidate for the 7.9 branch.
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_pack_color.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_fs.h"
|
||||
@@ -584,59 +585,56 @@ static uint32_t r300_get_border_color(enum pipe_format format,
|
||||
const float border[4])
|
||||
{
|
||||
const struct util_format_description *desc;
|
||||
float border_swizzled[4] = {
|
||||
border[2],
|
||||
border[1],
|
||||
border[0],
|
||||
border[3]
|
||||
};
|
||||
uint32_t r;
|
||||
float border_swizzled[4] = {0};
|
||||
unsigned i;
|
||||
union util_color uc = {0};
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* We don't use util_pack_format because it does not handle the formats
|
||||
* we want, e.g. R4G4B4A4 is non-existent in Gallium. */
|
||||
/* Apply inverse swizzle of the format. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
switch (desc->swizzle[i]) {
|
||||
case UTIL_FORMAT_SWIZZLE_X:
|
||||
border_swizzled[2] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Y:
|
||||
border_swizzled[1] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_Z:
|
||||
border_swizzled[0] = border[i];
|
||||
break;
|
||||
case UTIL_FORMAT_SWIZZLE_W:
|
||||
border_swizzled[3] = border[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (desc->channel[0].size) {
|
||||
case 4:
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf0) >> 4) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf0) << 0) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf0) << 4) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xf0) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
if (desc->channel[1].size == 5) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xf8) << 2) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 7) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0x80) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G5R5A1_UNORM, &uc);
|
||||
} else if (desc->channel[1].size == 6) {
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xf8) >> 3) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xfc) << 3) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xf8) << 8);
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B5G6R5_UNORM, &uc);
|
||||
} else {
|
||||
assert(0);
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 16:
|
||||
r = ((float_to_ubyte(border_swizzled[2]) & 0xff) << 0) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xff) << 8) |
|
||||
((float_to_ubyte(border_swizzled[0]) & 0xff) << 16) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xff) << 24);
|
||||
default:
|
||||
case 8:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
default:
|
||||
r = ((float_to_ubyte(border_swizzled[0]) & 0xff) << 0) |
|
||||
((float_to_ubyte(border_swizzled[1]) & 0xff) << 8) |
|
||||
((float_to_ubyte(border_swizzled[2]) & 0xff) << 16) |
|
||||
((float_to_ubyte(border_swizzled[3]) & 0xff) << 24);
|
||||
case 10:
|
||||
util_pack_color(border_swizzled, PIPE_FORMAT_B10G10R10A2_UNORM, &uc);
|
||||
break;
|
||||
}
|
||||
|
||||
return r;
|
||||
return uc.ui;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
|
||||
Reference in New Issue
Block a user