mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-23 19:10:21 +01:00
r300g: add support for formats beginning with X, like X8R8G8B8
This is actually a format translator fix.
This commit is contained in:
parent
4e07aadabb
commit
94e9ab975c
2 changed files with 40 additions and 12 deletions
|
|
@ -364,6 +364,7 @@ static INLINE uint16_t
|
|||
r300_translate_vertex_data_type(enum pipe_format format) {
|
||||
uint32_t result = 0;
|
||||
const struct util_format_description *desc;
|
||||
unsigned i;
|
||||
|
||||
desc = util_format_description(format);
|
||||
|
||||
|
|
@ -371,10 +372,17 @@ r300_translate_vertex_data_type(enum pipe_format format) {
|
|||
return R300_INVALID_FORMAT;
|
||||
}
|
||||
|
||||
switch (desc->channel[0].type) {
|
||||
/* Find the first non-VOID channel. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (desc->channel[i].type) {
|
||||
/* Half-floats, floats, doubles */
|
||||
case UTIL_FORMAT_TYPE_FLOAT:
|
||||
switch (desc->channel[0].size) {
|
||||
switch (desc->channel[i].size) {
|
||||
case 16:
|
||||
/* Supported only on RV350 and later. */
|
||||
if (desc->nr_channels > 2) {
|
||||
|
|
@ -394,7 +402,7 @@ r300_translate_vertex_data_type(enum pipe_format format) {
|
|||
case UTIL_FORMAT_TYPE_UNSIGNED:
|
||||
/* Signed ints */
|
||||
case UTIL_FORMAT_TYPE_SIGNED:
|
||||
switch (desc->channel[0].size) {
|
||||
switch (desc->channel[i].size) {
|
||||
case 8:
|
||||
result = R300_DATA_TYPE_BYTE;
|
||||
break;
|
||||
|
|
@ -413,10 +421,10 @@ r300_translate_vertex_data_type(enum pipe_format format) {
|
|||
return R300_INVALID_FORMAT;
|
||||
}
|
||||
|
||||
if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
|
||||
if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
|
||||
result |= R300_SIGNED;
|
||||
}
|
||||
if (desc->channel[0].normalized) {
|
||||
if (desc->channel[i].normalized) {
|
||||
result |= R300_NORMALIZE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -260,16 +260,26 @@ uint32_t r300_translate_texformat(enum pipe_format format,
|
|||
return ~0; /* Unsupported/unknown. */
|
||||
}
|
||||
|
||||
/* Find the first non-VOID channel. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 4)
|
||||
return ~0; /* Unsupported/unknown. */
|
||||
|
||||
/* And finally, uniform formats. */
|
||||
switch (desc->channel[0].type) {
|
||||
switch (desc->channel[i].type) {
|
||||
case UTIL_FORMAT_TYPE_UNSIGNED:
|
||||
case UTIL_FORMAT_TYPE_SIGNED:
|
||||
if (!desc->channel[0].normalized &&
|
||||
if (!desc->channel[i].normalized &&
|
||||
desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
|
||||
return ~0;
|
||||
}
|
||||
|
||||
switch (desc->channel[0].size) {
|
||||
switch (desc->channel[i].size) {
|
||||
case 4:
|
||||
switch (desc->nr_channels) {
|
||||
case 2:
|
||||
|
|
@ -303,7 +313,7 @@ uint32_t r300_translate_texformat(enum pipe_format format,
|
|||
return ~0;
|
||||
|
||||
case UTIL_FORMAT_TYPE_FLOAT:
|
||||
switch (desc->channel[0].size) {
|
||||
switch (desc->channel[i].size) {
|
||||
case 16:
|
||||
switch (desc->nr_channels) {
|
||||
case 1:
|
||||
|
|
@ -443,15 +453,25 @@ static uint32_t r300_translate_out_fmt(enum pipe_format format)
|
|||
|
||||
desc = util_format_description(format);
|
||||
|
||||
/* Find the first non-VOID channel. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 4)
|
||||
return ~0; /* Unsupported/unknown. */
|
||||
|
||||
/* Specifies how the shader output is written to the fog unit. */
|
||||
if (desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT) {
|
||||
if (desc->channel[0].size == 32) {
|
||||
if (desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) {
|
||||
if (desc->channel[i].size == 32) {
|
||||
modifier |= R300_US_OUT_FMT_C4_32_FP;
|
||||
} else {
|
||||
modifier |= R300_US_OUT_FMT_C4_16_FP;
|
||||
}
|
||||
} else {
|
||||
if (desc->channel[0].size == 16) {
|
||||
if (desc->channel[i].size == 16) {
|
||||
modifier |= R300_US_OUT_FMT_C4_16;
|
||||
} else {
|
||||
/* C4_8 seems to be used for the formats whose pixel size
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue