mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
r300g: Adopt osiris' PSC data and swizzle.
A fair amount more flexible and easier to maintain.
This commit is contained in:
parent
5de8f97440
commit
cab749a1d0
1 changed files with 87 additions and 39 deletions
|
|
@ -402,58 +402,106 @@ static INLINE uint32_t r300_translate_gb_pipes(int pipe_count)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Utility function to count the number of components in RGBAZS formats.
|
||||
* XXX should go to util or p_format.h */
|
||||
static INLINE unsigned pf_component_count(enum pipe_format format) {
|
||||
unsigned count = 0;
|
||||
|
||||
if (pf_layout(format) != PIPE_FORMAT_LAYOUT_RGBAZS) {
|
||||
return count;
|
||||
}
|
||||
|
||||
if (pf_size_x(format)) {
|
||||
count++;
|
||||
}
|
||||
if (pf_size_y(format)) {
|
||||
count++;
|
||||
}
|
||||
if (pf_size_z(format)) {
|
||||
count++;
|
||||
}
|
||||
if (pf_size_w(format)) {
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Translate pipe_formats into PSC vertex types. */
|
||||
static INLINE uint16_t
|
||||
r300_translate_vertex_data_type(enum pipe_format format) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_R32_FLOAT:
|
||||
return R300_DATA_TYPE_FLOAT_1;
|
||||
uint32_t result = 0;
|
||||
unsigned components = pf_component_count(format);
|
||||
|
||||
if (pf_layout(format) != PIPE_FORMAT_LAYOUT_RGBAZS) {
|
||||
debug_printf("r300: Bad format %s in %s\n", pf_name(format),
|
||||
__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (pf_type(format)) {
|
||||
/* Half-floats, floats, doubles */
|
||||
case PIPE_FORMAT_TYPE_FLOAT:
|
||||
switch (pf_size_x(format)) {
|
||||
case 4:
|
||||
result = R300_DATA_TYPE_FLOAT_1 + (components - 1);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32_FLOAT:
|
||||
return R300_DATA_TYPE_FLOAT_2;
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32B32_FLOAT:
|
||||
return R300_DATA_TYPE_FLOAT_3;
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32B32A32_FLOAT:
|
||||
return R300_DATA_TYPE_FLOAT_4;
|
||||
break;
|
||||
case PIPE_FORMAT_R8G8B8A8_UNORM:
|
||||
return R300_DATA_TYPE_BYTE |
|
||||
R300_NORMALIZE;
|
||||
/* Normalized unsigned ints */
|
||||
case PIPE_FORMAT_TYPE_UNORM:
|
||||
/* Normalized signed ints */
|
||||
case PIPE_FORMAT_TYPE_SNORM:
|
||||
/* Non-normalized unsigned ints */
|
||||
case PIPE_FORMAT_TYPE_USCALED:
|
||||
/* Non-normalized signed ints */
|
||||
case PIPE_FORMAT_TYPE_SSCALED:
|
||||
switch (pf_size_x(format)) {
|
||||
case 1:
|
||||
result = R300_DATA_TYPE_BYTE;
|
||||
break;
|
||||
case 2:
|
||||
if (components > 2) {
|
||||
result = R300_DATA_TYPE_SHORT_4;
|
||||
} else {
|
||||
result = R300_DATA_TYPE_SHORT_2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
debug_printf("r300: Implementation error: "
|
||||
"Bad vertex data format %s!\n", pf_name(format));
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
||||
if (pf_type(format) == PIPE_FORMAT_TYPE_SSCALED) {
|
||||
result |= R300_SIGNED;
|
||||
} else if (pf_type(format) == PIPE_FORMAT_TYPE_UNORM) {
|
||||
result |= R300_NORMALIZE;
|
||||
} else if (pf_type(format) == PIPE_FORMAT_TYPE_SNORM) {
|
||||
result |= (R300_SIGNED | R300_NORMALIZE);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static INLINE uint16_t
|
||||
r300_translate_vertex_data_swizzle(enum pipe_format format) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_R32_FLOAT:
|
||||
return R300_VAP_SWIZZLE_X001;
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32_FLOAT:
|
||||
return R300_VAP_SWIZZLE_XY01;
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32B32_FLOAT:
|
||||
return R300_VAP_SWIZZLE_XYZ1;
|
||||
break;
|
||||
case PIPE_FORMAT_R32G32B32A32_FLOAT:
|
||||
case PIPE_FORMAT_R8G8B8A8_UNORM:
|
||||
return R300_VAP_SWIZZLE_XYZW;
|
||||
break;
|
||||
default:
|
||||
debug_printf("r300: Implementation error: "
|
||||
"Bad vertex data format %s!\n", pf_name(format));
|
||||
assert(0);
|
||||
break;
|
||||
|
||||
if (pf_layout(format) != PIPE_FORMAT_LAYOUT_RGBAZS) {
|
||||
debug_printf("r300: Bad format %s in %s\n", pf_name(format),
|
||||
__FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return ((pf_swizzle_x(format) << R300_SWIZZLE_SELECT_X_SHIFT) |
|
||||
(pf_swizzle_y(format) << R300_SWIZZLE_SELECT_Y_SHIFT) |
|
||||
(pf_swizzle_z(format) << R300_SWIZZLE_SELECT_Z_SHIFT) |
|
||||
(pf_swizzle_w(format) << R300_SWIZZLE_SELECT_W_SHIFT) |
|
||||
(0xf << R300_WRITE_ENA_SHIFT));
|
||||
}
|
||||
|
||||
#endif /* R300_STATE_INLINES_H */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue